本文档介绍客户端上传常见问题的应对方案,以下示例适用于直传和客户端 sdk 上传场景。
一、限制上传大小的大小
场景1:PutObject 上传,通过设置 sts 临时密钥 policy 里的 condition 设置 numeric_less_than_equal 条件来实现
condition: {// 限制上传文件必须小于 5MB'numeric_less_than_equal': {'cos:content-length': 5 * 1024 * 1024},}
场景2:PostObject 上传,通过签名 policy 的 conditions 设置 content-length-range 条件来实现
var policy = JSON.stringify({...conditions: [['content-length-range', 1, 5 * 1024 * 1024], // 可限制上传文件大小范围比如1 - 5MB],});
以上示例对于超出5MB 的文件上传将返回报错 403。
二、限制上传文件的类型
场景1:PutObject 上传,通过设置 sts 临时密钥 policy 里的 condition 设置 string_like 条件来实现
condition: {// 限制上传文件 content-type 必须为图片类型'string_like': {'cos:content-type': 'image/*'}}
场景2:PostObject 上传,通过签名 policy 的 conditions 设置 $Content-Type 条件来实现
var policy = JSON.stringify({...conditions: [// 限制上传文件 content-type 必须为图片类型['starts-with', '$Content-Type', 'image/*'],],});
以上示例对于非图片文件的上传将返回报错 403。
三、上传文件防覆盖
在 Web 或客户端上传场景中,如果文件名由客户端指定,可能存在文件被覆盖上传的风险。
要防止文件被覆盖关键措施是服务端决定上传路径。
/** 服务端生成上传路径示例 nodejs **/// 获取前端传进来的文件后缀 extconst ext = req.query.ext;const cosKey = generateCosKey(ext);function generateCosKey(ext) {const date = new Date();const m = date.getMonth() + 1;const ymd = `${date.getFullYear()}${m < 10 ? `0${m}` : m}${date.getDate()}`;const r = ('000000' + Math.random() * 1000000).slice(-6);const cosKey = `file/${ymd}/${ymd}_${r}${ext ? `.${ext}` : ''}`;return cosKey;};
执行过程
1. 在客户端选择文件,客户端将后缀发送给服务端。
2. 服务端根据后缀,生成带时间的随机 COS 文件路径,并计算对应的签名,返回 URL 和签名信息给客户端。
3. 客户端使用 PUT 或 POST 请求,直传文件到 COS。
![](https://qcloudimg.tencent-cloud.cn/image/document/c7ef51f3392c0c0c8897260479254417.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/c7ef51f3392c0c0c8897260479254417.png)
相关文档
小程序直传实践
移动应用直传实践
鸿蒙直传实践