腾讯云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: admin
	password: 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 FileNotFoundError
        with 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 FileNotFoundError
        key = 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了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSDN博客批量查询质量分https://yma16.inscode.cc/请求超时问题(设置postman超时时间)(接口提供者设置了nginx超时时间)

文章目录 查询链接问题请求超时原因解决谷歌浏览器超时问题办法(失败了)谷歌浏览器不支持设置请求超时时间(谷歌浏览器到底有没限制请求超时?貌似没有限制?)看能否脱离浏览器请求,我们查看关键代…

Java负载均衡算法实现与原理分析(轮询、随机、哈希、加权、最小连接)

文章目录 一、负载均衡算法概述二、轮询(RoundRobin)算法1、概述2、Java实现轮询算法3、优缺点 三、随机(Random)算法1、概述2、Java实现随机算法 四、源地址哈希(Hash)算法1、概述2、Java实现地址哈希算法…

面试笔记:Android 架构岗,一次4小时4面的体验

作者:橘子树 此次面试一共4面4小时,中间只有几分钟间隔。对持续的面试状态考验还是蛮大的。 关于面试的心态,保持悲观的乐观主义心态比较好。面前做面试准备时保持悲观,尽可能的做足准备。面后积极做复盘,乐观的接受最…

【MongoDB】数据库、集合、文档常用CRUD命令

目录 一、数据库操作 1、创建数据库操作 2、查看当前有哪些数据库 3、查看当前在使用哪个数据库 4、删除数据库 二、集合操作 1、查看有哪些集合 2、删除集合 3、创建集合 三、文档基本操作 1、插入数据 2、查询数据 3、删除数据 4、修改数据 四、文档分页查询 …

Selenium之css怎么实现元素定位?

世界上最远的距离大概就是明明看到一个页面元素站在那里,但是我却定位不到!! Selenium定位元素的方法有很多种,像是通过id、name、class_name、tag_name、link_text等等,但是这些方法局限性太大, 随着自动…

PS透明屏,在科技展示中,有哪些优点展示?

PS透明屏是一种新型的显示技术,它将传统的显示屏幕与透明材料相结合,使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性,通…

旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?

齐奏AI交响曲的当下,赛道玩家各自精彩。其中,被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆,并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型,AI四小龙谁都不甘其后。 以深耕AIoT软硬一…

机器学习-自定义Loss函数

1、简介 机器学习框架中使用自定义的Loss函数, 2、应用 (1)sklearn from sklearn.metrics import max_error from sklearn.metrics import make_scorer from sklearn.model_selection import cross_val_score from sklearn.linear_model …

腾讯云标准型CVM云服务器详细介绍

腾讯云CVM服务器标准型实例的各项性能参数平衡,标准型云服务器适用于大多数常规业务,例如:web网站及中间件等,常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格,腾讯云服务器网来详细说下云服务器CVM标准…

Ubuntu22.04安装docker

在ubuntu22.04上安装docker还是比较容易的,之前在公司的centos6上边装docker,那才真是一言难尽呀,废话不多说,开始安装 1、更新包管理器 apt update 2、安装必要的软件包,以便允许 apt 使用 HTTPS 仓库 sudo apt i…

手撕Java集合——链表

链表 一、链表概念特性二、不带头单向非循环链表实现🍑1、定义结点🍑2、打印链表🍑3、使用递归逆序打印链表🍑4、头插🍑5、尾插🍑6、指定位置插入🍑7、查找是否包含关键字key是否在单链表当中&a…

多传感器融合相关技术

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。 一、参考资料 多传感器融合定位学习 深蓝-多传感器定位融合 深蓝学院 多传感器融合定位 作业 多传感器融合详解 二、相关介绍 1. 毫米波雷达(Radar&a…

R语言4_安装BayesSpace

环境Ubuntu22/20, R4.1 你可能会报错说你的R语言版本没有这个库,但其实不然。这是一个在Bioconductor上的库。 同时我也碰到了这个问题,ERROR: configuration failed for package systemfonts’等诸多类似问题,下面的方法可以一并解决。 第…

790. 多米诺和托米诺平铺

题目描述&#xff1a; 主要思路&#xff1a; class Solution { public:int numTilings(int n) {long long f[n][4],mod1e97;f[0][0]1;f[0][1]f[0][2]0;f[0][3]1;for(int i1;i<n;i){f[i][0]f[i-1][3];f[i][1] (f[i-1][0]f[i-1][2])%mod;f[i][2] (f[i-1][0]f[i-1][1])%mod;f…

力扣221.最大正方形(动态规划)

思路&#xff1a; 思路&#xff1a;从[0,0]元素开始&#xff0c;计算每个元素对应其与[0,0]之间矩阵块中最大正方形边长情况&#xff1a;1&#xff09;matrix [ i , j ] ‘0’ --> 元素对应的最大正方形为0。情况&#xff1a;2&#xff09;matrix [ i , j ] ‘1’ -->…

中级课程-SSRF(CSRF进阶)

文章目录 成因危害挖掘 成因 危害 挖掘

详解JAVA远程debug

目录 1.什么是远程debug&#xff1f; 2.远程debug普通JAVA程序 环境 测试程序 程序启动指令 编译器配置 3.远程debug JAVA Web程序 4.远程debug spring boot程序 1.什么是远程debug&#xff1f; 远程debug&#xff0c;也就是可以在本地debug远端部署的程序&#xff0c…

界面控件DevExpress WPF Chart组件——拥有超快的数据可视化库!

DevExpress WPF Chart组件拥有超大的可视化数据集&#xff0c;并提供交互式仪表板与高性能WPF图表库。DevExpress Charts提供了全面的2D / 3D图形集合&#xff0c;包括数十个UI定制和数据分析/数据挖掘选项。 PS&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助…

快速上手PyCharm指南

PyCharm简介 PyCharm是一种Python IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动…

Fabric系列 - 知识点整理

知识点 源码编译 主机编译 容器编译 手动部署(docker-compose) 单peer 多peer 中途加peer 多主机多peer 链码 语法, 接口 (go版) 命令行调用 ca server 在DApp中使用SDK调用 (js版) 部署的几个阶段 部署1排序和1节点, 1组织1通道 光部署能Dapp 带ca server (每个组织一个)…