腾讯云COS的快速接入

news2024/9/25 1:25:47

背景

最近在研究一个剪贴板粘贴工具,实现粘贴图片,返回可访问的地址,这个在我的哔哩哔哩上有出一期视频🤭。但是,我发现部分博客平台不能正常的转载我的图片链接,于是研究了一下腾讯云的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了。

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

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

相关文章

MySQL数据库面试题:如何优化呢?

文章目录 优化字段类型的选择优化索引的使用优化SQL语句事务与隔离级别并发事务的问题与解决undo log和redo log的区别事务的隔离性与MVCCMySQL主从同步原理分库分表的经验水平分库的应用 在数据库开发中,创建表是一个至关重要的步骤,优化设计可以显著提…

【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

遍历集合List的五种方法以及如何在遍历集合过程中安全移除元素

一、遍历集合List的五种方法 测试数据 List<String> list new ArrayList<>(); list.add("A");list.add("B");list.add("C");1. 普通for循环 普通for循环&#xff0c;通过索引遍历 for (int i 0; i < list.size(); i) {Syst…

《UNUX环境高级编程》(14)高级I/O

1、引言 2、 非阻塞I/O 系统调用分为两类&#xff1a;低速系统调用和其他系统调用。低速系统调用是可能会使进程永远阻塞的一类系统调用&#xff0c;包括&#xff1a; 如果某些文件类型&#xff08;如读管道、终端设备和网络设备&#xff09;的数据并不存在&#xff0c;读操作…

国产低功耗蓝牙HS6621CxC/6621Px系列支持Find My网络功能方案芯片

目录 什么是“Find My“&#xff1f;HS6621系列简介 什么是“Find My“&#xff1f; “Find My”是苹果公司于19年前推出的针对失物追踪&#xff0c;Find My iPhone&#xff08;查找我的iPhone&#xff09;和Find My Friends&#xff08;查找朋友&#xff09;的结合体应用。为…

【CSS3】CSS3 动画 ④ ( 使用动画制作地图热点图 )

文章目录 一、需求说明二、动画代码分析1、地图背景设置2、热点动画位置测量3、热点动画布局分析4、动画定义5、小圆点实现6、波纹效果盒子实现7、延迟动画设置 三、代码示例 一、需求说明 实现如下效果 , 在一张地图上 , 以某个位置为中心点 , 向四周发散 ; 核心 是实现 向四周…

go-zero 是如何做路由管理的?

原文链接&#xff1a; go-zero 是如何做路由管理的&#xff1f; go-zero 是一个微服务框架&#xff0c;包含了 web 和 rpc 两大部分。 而对于 web 框架来说&#xff0c;路由管理是必不可少的一部分&#xff0c;那么本文就来探讨一下 go-zero 的路由管理是怎么做的&#xff0c…

速卖通,国际站店铺想要增加曝光,提升销量,测评补单有效果吗?

作为一个卖家&#xff0c;成功运营速卖通店铺需要一系列的策略和技巧 1.借助平台的力量对于成长期的店铺来说&#xff0c;平台本身是最大的流量来源。如何从平台那儿获取更多的支持则成为这个阶段最重要的难题。以速卖通为例&#xff0c;经过反复测试&#xff0c;平台给普通卖家…

LeetCode练习习题集【4月 - 7 月】

LEETCODE习题集【4月-7月总结】 简单 数组部分 1.重复数 题目&#xff1a; 在一个长度u为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中…

蛋糕小程序商店制作攻略教程分享

想要开发一个蛋糕小程序商店&#xff0c;可以通过以下步骤进行操作&#xff1a; 1.首先&#xff0c;我们需要注册登录账号&#xff0c;进入操作后台。找到并点击【商城】中的【去管理】进入商城的后台管理页面。然后再点击【小程序商城】模块中的【去装修】进入小程序商城的制作…

【torch.nn.PixelShuffle】和 【torch.nn.UnpixelShuffle】

文章目录 torch.nn.PixelShuffle直观解释官方文档 torch.nn.PixelUnshuffle直观解释官方文档 torch.nn.PixelShuffle 直观解释 PixelShuffle是一种上采样方法&#xff0c;它将形状为 ( ∗ , C r 2 , H , W ) (∗, C\times r^2, H, W) (∗,Cr2,H,W)的张量重新排列转换为形状为…

网络安全 Day28-运维安全项目-加密隧道

运维安全项目-加密隧道 1. 加密隧道服务概述2. openVPN应用场景3. 虚拟机环境准备3.0 准备知识3.1 添加网卡![请添加图片描述](https://img-blog.csdnimg.cn/f155ca2804d84118b89a69da3688911e.png)3.2 配置内网&#xff08;LAN区段)3.3 虚拟机选择LAN区段3.4 书写eth1网卡配置…

力扣hot100刷题记录

二刷hot100&#xff0c;坚持每天打卡&#xff01;&#xff01;&#xff01; 1. 两数之和 // 先求差&#xff0c;再查哈希表 public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map new HashMap<>();for(int i 0;i<nums.length;i){int key …

UE Mesh Generation and Editing at Runtime

UE Mesh Generation and Editing at Runtime 虚幻运行时和编辑器下生成和编辑 网格体。 UE Mesh 虚幻中常用的三种网格体 UProceduralMeshComponent 程序化网格体 UStaticMeshComponent 静态网格体 USimpleDynamicMeshComponent 动态网格体 借用他人总结的&#xff0c;UE4…

设计一个“完美“的测试用例,用户登录模块实例...

前言 好的测试用例一定是一个完备的集合&#xff0c;它能够覆盖所有等价类以及各种边界值&#xff0c;而跟能否发现缺陷无关 好的测试用例必须具备哪些特征 整体完备性&#xff1a;一定是一个完备的整体&#xff0c;是有效测试用例组成的集合&#xff0c;能够完全覆盖测试需…

在vue中Antv G2 折线图如何添加点击事件获取折线上点的值

在项目中有个需求是点击折线图的点&#xff0c;获取当前点的信息&#xff0c;其它图形都可以参考相关的API获取到&#xff0c;但area做的折线图怎么都获取不到点击的信息&#xff0c;只能获取全部的信息&#xff0c;最终解决如下&#xff1a; 实现思路 用户的鼠标在折线图上移…

高中教师能去美国做访问学者吗?

美国作为世界上高等教育水平较高的国家之一&#xff0c;吸引了众多学者前往交流学习。那么高中教师是否能够成为美国访问学者&#xff0c;这是当然的&#xff0c;高中老师是可以出国访学的&#xff0c;但是出国做访问学者会涉及到多方面的因素。 首先&#xff0c;教师个人的学术…

带你Debug SpringApplication.run(MainApp.class, args) 看看SpringBoot 如何启动Tomcat

&#x1f600;前言 本篇博文是关于SpringBoot 如何启动Tomcat的笔记&#xff0c;希望能够让你到SpringBoot印象深刻&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到…

2023深圳杯A题完整代码模型

已更新深圳杯A题全部版本&#xff0c;文末获取&#xff01; 摘要 现代社会&#xff0c;随着生活方式的变化和工作压力的增大&#xff0c;慢性非传染性疾病日益成为威胁公众健康的主要问题。心脑血管疾病、糖尿病、恶性肿瘤及慢性阻塞性肺病等慢性病的发病率呈现出上升趋势。为…

Linux 安装部署Seata

标题&#xff1a;在Linux上安装部署Seata分布式事务解决方案 导语&#xff1a; Seata是一个开源的分布式事务解决方案&#xff0c;旨在解决分布式环境下的事务一致性问题。本文将为您介绍如何在Linux操作系统上安装和部署Seata&#xff0c;为您的分布式应用添加强大的事务支持。…