
业务里常见需求:用户从浏览器或小程序直接上传文件到对象存储 COS,或让第三方临时下载私有文件。如果把永久密钥放到前端,一旦泄露整个账号下的资源都有风险。官方文档推荐的做法是:服务端用临时密钥生成预签名 URL,客户端只拿到一个有时效的链接。本文整理这套流程和踩坑点。
COS 默认桶和对象都是私有的。预签名 URL 把签名信息嵌入 URL,持有链接的人在有效期内可以完成指定操作,过期即失效。关键点:
不要给上传用的密钥授予整个桶的读写。以“只允许上传到某前缀”为例,权限范围控制在:
name/cos:PutObject(只下载则用 name/cos:GetObject)uploads/ 前缀,例如 qcs::cos:ap-guangzhou:uid/<appid>:<bucket>/uploads/*具体 resource 的写法请以 CAM 策略语法文档为准。
安装官方 SDK:
pip install -U cos-python-sdk-v5生成上传和下载链接:
from qcloud_cos import CosConfig, CosS3Client
config = CosConfig(
Region="ap-guangzhou",
SecretId=tmp_secret_id, # 临时密钥,由 STS 获取
SecretKey=tmp_secret_key,
Token=tmp_token,
Scheme="https",
)
client = CosS3Client(config)
# 上传链接,有效 300 秒
put_url = client.get_presigned_url(
Method="PUT", Bucket="examplebucket-1250000000",
Key="uploads/2026/avatar.png", Expired=300,
)
# 下载链接
get_url = client.get_presigned_url(
Method="GET", Bucket="examplebucket-1250000000",
Key="uploads/2026/avatar.png", Expired=300,
)使用临时密钥时,生成的 URL 里会带 x-cos-security-token 参数,不要手工去掉。
curl -X PUT -T avatar.png "<put_url>"前端用 fetch(put_url, { method: "PUT", body: file }) 即可。注意 Content-Type 等请求头如果参与了签名,上传时必须保持一致,否则会返回签名不匹配。
Expired 设置,以及临时密钥自身的有效期,链接有效期不会超过密钥有效期预签名 URL 的核心是“服务端持密钥,客户端持短时链接”。配合临时密钥和最小权限策略,可以在不暴露长期凭证的前提下实现前端直传和临时分享。具体参数与限制以官方文档和控制台为准。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。