腾讯云COS的快速接入

背景

最近在研究一个剪贴板粘贴工具,实现粘贴图片,返回可访问的地址,这个在我的哔哩哔哩上有出一期视频🤭。但是,我发现部分博客平台不能正常的转载我的图片链接,于是研究了一下腾讯云的COS(阿里的叫OSS,最开始我还不知道腾讯云的叫COS🥹),想着其它平台应该可以转载这个在线的地址吧🤭。我的最终的效果如下:

本期文章,我不会教大家如何的开通腾讯云的COS,如何去上传文件,我只会展示我觉得我代码设计的亮点,以及可以去分享的地方。不会如何对接的,参考COS python SDK文档

我的项目设计的亮点有:

  • 开发的密钥脱离代码,单独放在服务器上
  • 工具类的定义和代码分层
  • 可以提供本地使用(cmd命令行)

下边我将逐一分析。

亮点

开发的密钥脱离代码

按照我的常识,我们的代码中的配置项是固定的字符串的话,可以分为5种情况讨论,来看看程序员对代码的负责程度和写代码的规范性。

level one

Credit credit = new Credit("admin", "admin");

直接在代码里干,读过阿里巴巴《Java开发规范》的都知道,这出现了魔法值,不符合规范。

level two

private static final String USERNAME = "admin";
private static final String PASSWORD = "admin";Credit credit = new Credit(USERNAME, PASSWORD);

用静态的常量写,摆脱了魔法值,方便修改。但是还是不优雅,业务类里边加上了配置的代码。而且,配置很散,配置项的堆积直接造成屎山的产生。

level three

public class AuthConfig {private String username = "admin";private String password = "admin";
}public class Service {private AuthConfig config;// 省略业务逻辑Credit credit = new Credit(config.username, config.password);
}

现在舒服多了,配置项那么多,我都通过类来隔离了,要哪个导入哪个。但是,细心的或者说比较喜欢精益求精的你,这样安全吗?特别是具有特别高权限的账户密码,得到了是不是可以为所欲为了?

Level four

这一级别基本上懂点spring cloud的配置组件了,别提spring cloud config了,我用的是nacos,全称不要忘记了,namespace and config system。这一级别,很好的防治了为所欲为的产生,因为我有配置中心,稍微一管控,不是任何人都可以看到的。

nacos怎么用,自己百度去吧。看看yml文件:

auth:username: adminpassword: admin

java代码是这样的:

@ConfigurationProperties(prefix = "auth")
@Component
@Data
public class AuthConfig {private String username;private String password;
}

怎么样,是不是简单。记得用上lombok。除此之外,我还可以实现在nacos上的更改,我服务可以动态的获得新配置,不用重启服务!

level five

最后一级了,终极大招!安全度98%,除非开放了服务器的root访问权限。

这样,先看看代码,我用python写的,各种编程语言异曲同工。

class COSUtil():def __init__(self) -> NoReturn:config_file = os.path.expanduser('~') + '/.tencentcloud/tencent.json'if not os.path.isfile(config_file):raise FileNotFoundErrorwith open(config_file, 'r') as file:config_data = json.load(file)if not config_data:raise ValueError('config file is empty')secret_id = config_data['SecretId']secret_key = config_data['SecretKey']self.default_bucket = config_data['defaultBucket']self.region = 'ap-shanghai'config = CosConfig(Region=self.region, SecretId=secret_id, SecretKey=secret_key)client = CosS3Client(config)self.client = client

巧妙点就在于我的配置文件完全在服务器,与代码无关。有人说:我的是docker容器部署的怎么办。怎么办?重学docker,docker的文件挂载忘啦。

OK,读取文件的内容,再转化成一个对象,根据key获得对应的配置。巧啊,妙啊,优雅。别问我怎么学到的,我看腾讯云的CDB sdk源码获得的。

是不是觉得很神奇,觉得神奇的话,记得点赞、在看、转发、关注哈

工具类的定义和代码分层

我的类定义和__init__初始化已经在上边罗列了。那我要上传文件怎么玩?直接一个方法安排上!

def upload_file_binary(self, filepath:str, bucket: Optional[str]= None, filename: Optional[str]= None) -> str:"""二进制上传Args:filepath (str): _description_bucket (_type_, optional): _description_. Defaults to Optional[String].filename (_type_, optional): 文件名,可以指定在存储桶中的位置. Defaults to Optional[String].Raises:FileNotFoundError: _description_Returns:str: 文件的预览地址"""if not os.path.isfile(filepath):raise FileNotFoundErrorkey = filename or os.path.basename(filepath)with open(filepath, 'rb') as fp:self.client.put_object(Bucket= bucket or self.default_bucket,Body=fp,Key=key,StorageClass='STANDARD',EnableMD5=False)return self.get_preview_url(key)

说实话,自己都觉得巨优雅。方法上参数的类型约束、方法文档,我觉得都很无懈可击。直接调用我的方法就可以看到我的方法是干什么的,需要什么参数。

cmd中使用

工具类的意义就是简化方法的调用,代码的耦合度。我很喜欢我的mac,可以给我提供linux的开发环境,让我各种倒腾。先看效果:

是不是觉得很好用了。我本地只需要这样就可以上传图片获得文件的在线地址(预览地址)。

cos 文件的相对路径/绝对路径

怎么实现的呢?来看看:

if __name__ == '__main__':cosUtil = COSUtil()# print(cosUtil.list_buckets())print('upload local file to COS bucket')filepath = sys.argv[1]if not filepath or not os.path.isfile(filepath):raise FileExistsError(f'{filepath}')preview_path = cosUtil.upload_file_binary(filepath)print(f'successfully uploaded, preview_url: {preview_path}')

其实浓缩起来,一行代码就可以解决。

我另外需要配置一个alias,记得在.bash_profile中配置。不会这个文件的,建议百度学习一下。

alias cos="python3 xxxx/cos.py $*"

$*表示把控制台参数全部传递给python的__main__

至此,我的COS被我整的很nice了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux程序保护机制gcc编译选项

预备知识: 计算机内存的结构通常包括以下几个主要部分: 1.代码段(Code Segment):也称为文本段,存储程序的可执行指令。代码段是被标记为可执行的,程序从代码段中获取指令并执行。 2.数据段(Data Segment)&#xff1a…

代码随想录day01

数组理论基础 ● 思维不难,主要是考察对代码的掌控能力 ● 内存中的存储方式:存放在连续内存空间上的相同类型数据的集合 ● 数组可以通过下标索引获取到下标对应的数据 ● 数组下标从0开始 ● 因为内存空间地址连续,因此删除或增加元素的时…

现代C++中的从头开始深度学习:【4/8】梯度下降

一、说明 在本系列中,我们将学习如何仅使用普通和现代C编写必须知道的深度学习算法,例如卷积、反向传播、激活函数、优化器、深度神经网络等。 在这个故事中,我们将通过引入梯度下降算法来介绍数据中 2D 卷积核的拟合。我们将使用卷积和上一个…

大数据技术之Hadoop:HDFS集群安装篇(三)

目录 分布式文件系统HDFS安装篇 一、为什么海量数据需要分布式存储 二、 分布式的基础架构分析 三、 HDFS的基础架构 四 HDFS集群环境部署 4.1 下载安装包 4.2 集群规划 4.3 上传解压 4.4 配置HDFS集群 4.5 准备数据目录 4.6 分发hadoop到其他服务器 4.7 配置环境变…

OpenStack监控工具

OpenStack是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。由NASA和Rackspace合作研发并发起,以Apache许可证(Apache软件基金会发布的一个自由软件许可证)授权。 OpenStack为私有云和公有云提供可扩展的弹性的云计算…

rancher证书过期,更新操作

看着比其他的都靠谱,我这里转载一下,以变下次找不到了 http://t.csdn.cn/p1QLU

Cadvisor+InfluxDB+Grafan+Prometheus(详解)

目录 一、CadvisorInfluxDBGrafan案例概述 (一)Cadvisor Cadvisor 产品特点: (二)InfluxDB InfluxDB应用场景: InfluxDB主要功能: InfluxDB主要特点: (三&#…

·[K8S:使用calico网络插件]:解决集群节点NotReady问题

文章目录 一:安装calico:1.1:weget安装Colico网络通信插件:1.2:修改calico.yaml网卡相关配置:1.2.1:查看本机ip 网卡相关信息:1.2.2:修改calico.yaml网卡interface相关信…

深度解读|一站式ABI平台 Smartbi Insight V11 能力再升级

纵观过去,我们发现汽车和BI的发展有异曲同工之妙。 100来年,汽车的动力从蒸汽到燃油再到新能源,汽车的操控方式从手动到自动再到智能无人驾驶。而在BI领域,自1958年BI的概念提出后,底层数据准备从报表开发、Cube多维模…

【CI/CD】Git Flow 分支模型

Git Flow 分支模型 1.前言 Git Flow 模型(本文所阐述的分支模型)构思于 2010 年,也就是 Git 诞生后不久,距今已有 10 多年。在这 10 多年中,Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里,Git 本身…

最大子数组和【力扣53】

一、解题思路 Max[i]表示:以nums[i]为开头的所有连续子数组和的最大值。 由此可以推出Max[i-1]和Max[i]的关系: 若Max[i]>0:Max[i-1]nums[i-1]Max[i]; 否则:Max[i-1]nums[i-1]; 则ansMAX&#xff0…

java try-with-resources自动关闭资源

try-with-resources 是 Java 7 引入的一种语法,用于自动关闭实现了 AutoCloseable 接口的资源。它可以简化代码中关闭资源的操作,确保资源得到正确释放,避免内存泄漏。 使用 try-with-resources 的语法如下: try (资源的声明和初…

RISC-V走向开放服务器规范

原文:RISC-V Moving Toward Open Server Specification 作者:Agam Shah 转载自:https://www.hpcwire.com/2023/07/24/risc-v-moving-toward-open-server-specification/ 中文翻译: 2023年7月24日 RISC-V International目前正…

亚马逊 EC2服务器下部署java环境

1. jdk 1.8 安装 1.1 下载jdk包 官网 Java Downloads | Oracle tar.gz 包 下载下来 1.2 本地连接 服务器 我用的是亚马逊的ec2 系统是 ubuntu 的 ssh工具是 Mobaxterm , 公有dns 创建实例时的秘钥 链接 Mobaxterm 因为使用的 ubuntu 所以登录的 名称 就是 ubuntu 然后 …

ts项目中引入js包,如vue-simple-uploader

有些包如vue-simple-uploader,使用npm下载后,npm仓库中没有对应的types类型声明,会报错,没有找到对应的types类型文件。 解决: 在项目根目录下,创建自定义的类型声明文件,如,self-…

【Ubuntu】简化反向代理和个性化标签页体验

本文将介绍如何使用Docker部署Nginx Proxy Manager和OneNav,两个功能强大且易用的工具。Nginx Proxy Manager用于简化和管理Nginx反向代理服务器的配置,而OneNav则提供个性化的新标签页体验和导航功能。通过本文的指导,您将学习如何安装和配置…

vue组件通信的方式?

父子通信&#xff1a; 1、父传子&#xff1a;在父组件的子组件标签绑定一个自定义属性&#xff0c;子组件通过props获取父组件传递的数据。 //父 <child :data"list" del"idx > list.splice(idx, 1)" ref"child" :isShow.sync"isS…

Redis可以用作数据库吗?它的适用场景是什么?

是的&#xff0c;Redis可以用作数据库。虽然Redis通常被认为是一个内存数据库&#xff08;in-memory database&#xff09;&#xff0c;但它也可以通过持久化机制将数据保存在磁盘上&#xff0c;以便在重启后恢复数据。 Redis的适用场景包括但不限于以下几个方面&#xff1a; …

程序使用Microsoft.XMLHTTP对象请求https时出错解决

程序中使用Microsoft.XMLHTTP组件请求https时出现如下错误&#xff1a; 出错程序代码示例&#xff1a; strUrl "https://www.xxx.com/xxx.asp?id11" dim objXmlHttp set objXmlHttp Server.CreateObject("Microsoft.XMLHTTP") objXmlHttp.open "…

电脑关机程序

//关机程序 1、电脑运行起来后&#xff0c;1分钟内关机。 2、如果输入&#xff1a;我是猪。就取消关机。 #include<stdio.h> #include<string.h> int main() { char input[20] { 0 }; system("shutdown -s -t 60"); again: printf(&quo…