有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
本文档介绍客户端上传常见问题的应对方案,以下示例适用于直传和客户端 sdk 上传场景。
服务端代码实现以 Node.js 为例,完整代码请参考 Node.js 示例

一、限制上传大小的大小

场景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 **/

// 获取前端传进来的文件后缀 ext
const 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。




相关文档