腾讯云COS对接这套代码够我用一辈子(附源码)

2026-05-04 0 929

先跟你说件事。

我刚刚被领导骂了,骂了一下午,原因是“h”。

就是这个破COS。腾讯云的对象存储

事情是这样的。

公司打算制作一个具备上传图片功能的小程序,而我当时心里想着,这难道还会存在什么难度吗?直接利用SDK一股脑地进行操作便是了。

结果呢?三天没跑通。

cos-js-sdk-v5为什么一直403

第一天,前端小哥告诉我:报403。

我从后端签出 后,将其传过去,结果却是不对,可明明是按照文档来操作的呀。

而后,将的全部翻了个遍,发觉有一个帖子讲道,在线签名工具能够挽救我的性命。

哦对了,官方有个签名生成网站:,我试了一下,瞬间定位到问题——我的配错了。

天哪。

写错酿大祸

一个字母的事。

桶在北京,我配的是“ap-”。少了个n。

这套糟糕的 API 校验极其严格, 务必要是一一对应的简称,就像“ap-”、“ap-”这样,哪怕写错一个字,那在全网范围内都会失效。

在这上面花了我整整一天排查时间。

和怎么填

简单总结一下,正确的配置就这么几行:

Java版本:

= “ap-“;

= “名字-你的APPID”;

版本:

从导入,从导入。

等于,,其中是’ap-‘,是’你自己的’,是’你自己的’。

= ()

看似很简单对不对?但掉坑的人一抓一大把。

临时密钥vs永久密钥选哪个

第二个让我抓狂的是签名机制。

直接写在代码里的永久密钥被安全团队打了回来,说风险太大。

后来改用STS临时密钥。

大体流程是,后端凭借永久密钥前往腾讯云去换取一个临时密钥返程,其有效期仅有一两小时,客户端拿着该临时密钥去直接上传至COS。

Token也不能忘,漏掉Token签名就废了。

签名过期怎么处理

坑爹的事还在后面。

上传大文件的时候,签名会过期!

甚是尤其为分片上传,每一个分片皆是一个独自的请求。要是签名于某一个分片上传之际失效了,后续的分片统统呈现403。

解决方案简单粗暴:

仅需重新生成签名便可。要是重新生成之时出现报错情况,那就检查一下服务器的本地时间是否准确,要知道签名对于时间是极为敏感的。

我于线上环境碰到过,服务器时间为UTC,其相较于北京时间晚了8小时,致使签名全部失败,花费了半个多小时才排查出问题根源。

自己的预签名工具

后来我干脆写了个预签名URL的工具类。

其核心思想在于,服务器仅仅承担生成临时签名的职责,客户端凭借该签名去直接连接COS,如此一来,服务器所承受的压力相对较小,并且在上传速度和安全性这两方面同时加以兼顾。

代码逻辑大概是这样的:

公开的,字符串类型的生成预先签名的方法,该方法带有两个参数,第一个参数是存储桶名称,第二个参数是键。

// 构建签名参数

// 关键参数有,存储桶的名称,文件的键,超文本传输协议的方法,有效的期限。

// 返回一个携带签名的URL

;

}

将这个工具封装完毕后,前端方面基本上无需对代码作出修改,仅仅凭借URL便能够进行上传以及下载操作,感觉舒坦了许多。

PHP版本一个大坑

腾讯云COS存储对接源码

对了,如果你是PHP开发者,注意这个致命坑。

在网络之上,存在着数量众多的教程,它们指引你去运用 “/cos-sdk-v5” 这个操作,然而,此包自2021年起始,已然废弃不用了,官方已经将其进行了归档处理,在默认状态下是无法安装成功的。

正确做法是:

命令行中,执行这样一则指令,即软件包管理器要求安装,名为cos-php-sdk-v5的软件包。

中间没有/前缀。

此外,PHP版本需要大于或等于7.2,更理想的是升至8.1及以上版本,因为旧版本存在各类莫名奇妙的兼容问题,以及警告频繁刷屏的情况。

是我因为一直坚持使用PHP 7.0呢,结果不管干啥就是死活运行不顺畅,最终才察觉到官方文档明明在那个地方摆着,只是我之前没有用心去看。真的是特别难看啊。

C#版本也别碰旧轮子

C#这边同样踩过坑。

决不要选用旧版的,它属于底层封装,不会主动处理分块上传,也不会处理断点续传来重试逻辑,要是出了问题得自己承担责任。

推荐直接采用 ..Cos.Sdk,它是官方当下最为稳定的,且维护最为及时的包。

并且大文件需要搭配,会智能化地将文件切割成一个个分块,这些分块默认每块为5MB,在网络出现波动的情况下会自动进行重试。

批量上传1000个文件

还有一个常见场景——批量上传。

COS Java软件开发工具包存在一个名为的方法,该方法具备支持一次删除数量最多达1000个对象的功能。

上传时也有个技巧:不要循环一个一个处理,那样网络开销太大。

在代码当中,我运用了连接池之后,将数量为1000个的文件投放至一个线程池里,以并发的方式进行上传,速度得到了好几倍的提升。

可要留意了,并发数量不可以超出允许的最大限度,将范畴把控在5到10这个区间就行了,不然COS会实施流量限制。

CORS也是个磨人精

差点忘了说CORS配置。

很多前端死在403就是因为忘了在控制台配跨域规则。

进入COS控制台,前往基础配置,找到跨域访问CORS,一定要将前端域名添加进去。

否则浏览器直接把你的请求挡在外面,怎么调都没用。

最后给你一个完整Demo

说了这么多,直接上硬货。

这是我封装的类核心代码:

class {

;

;

// 上传对象

定义一个方法,该方法名为 ,其返回类型是 ,此方法带有两个参数,一个参数是字符串类型的key ,另一个参数是文件类型的file。

创建一个 对象,将其命名为 ,该对象基于存储桶名称 、键 key 以及文件 file 来构建。

返回,由cos客户端执行,向其放入对象的请求操作,此操作的返回结果。

}

// 下载对象

获取物件,该物件以代表一把钥匙的字符串为依据并且从公开领域获得,,此方法返回一个COS物件。

创立一个名为 的物件获取请求实例,该实例使用存储桶名称以及键来实例化。

返回,通过调用的方法,传入对象所获取到的结果。

}

// 删除对象

定义一个公开的方法,这个方法用于删除对象,该对象通过一个字符串类型的键来标识。

将存储桶名称为里面名为key的对象,由进行删除操作。

}

}

这是从真实项目里扒出来的,实测可用。

写在最后

折腾了整整一周,踩了十多个坑。

最后才发觉,编写代码时最为困难的,向来都并非技术自身,而是那些你原本觉得自己清楚,然而事实上你却压根不明了的事情。

像是“ap-”而非“ap-”这样,像PHP包早就更换了名字这般,如签名在分片上传的时候会过期一样。

这篇文章,没给你讲述什么高端大气上档次的架构,也没阐述什么高深莫测的原理,尽皆是你极有可能遭遇,大大有概率会踩到的那些坑。

希望你不要像我一样,被领导和产品挨个问候。

全篇源码已整理好,需要的话直接拿走用吧。

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

七爪网 行业资讯 腾讯云COS对接这套代码够我用一辈子(附源码) https://www.7claw.com/2827786.html

七爪网源码交易平台

相关文章