一 、js前端
1.请求服务端接口,获取sts临时授权
服务端提供接口,无需入参,返回
- 正确AccessKeyId、AccessKeySecret、SecurityToken,
- bucket:可以接口返回,也可前后端约定
- region:默认'oss-cn-beijing',接口返回则使用接口返回的
2.通过阿里云提供的sdk,分片上传
可参照阿里云文档https://help.aliyun.com/document_detail/64041.html?spm=a2c4g.11186623.6.1372.41c179f8tm8T5o
- 安装npm install ali-oss
- 每个分片的大小不要超过1MB,也不要小于100KB。OSS服务器不接受小于100KB大小的分片。
- 分片上传
let result = await client.multipartUpload('object-key', 'file-object', {
progress: function (p, checkpoint) {
// 断点记录点。浏览器重启后无法直接继续上传,您需要手动触发上传操作。
tempCheckpoint = checkpoint;
},
mime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel'
})
3.待实现断点续传
二、OSS端设置
- 跟据官方文档配置子用户、角色、权限策略 help.aliyun.com/document_de…
- 设置OSS允许跨域访问:help.aliyun.com/document_de…
- 将相关参数提供给相关开发,需要的参数有:子账号的accessKeyId、accessKeySecret、RegionId、RoleArn、bucketName
三、服务端临时授权接口
- java端参考官方示例 help.aliyun.com/document_de…
- node端可以domo:iuap-cloud-exceltrain-fe/src/web/server/router.js
router.post('/import/assumeRole', async function (ctx) {
var client = new Core({
accessKeyId: '防止泄漏',
accessKeySecret: '防止泄漏',
endpoint: 'https://sts.cn-beijing.aliyuncs.com',
apiVersion: '2015-04-01'
});
//设置参数,指定角色ARN,并设置Policy以进一步限制STS Token获取的权限
var params = {
"RegionId": "cn-beijing",
'RoleArn': '防止泄漏',
'RoleSessionName': '',
};
var requestOption = {
method: 'POST'
};
ctx.body =await client.request('AssumeRole', params,requestOption)
})
- nodejs端sdk官方文档 help.aliyun.com/document_de…
四、遇到的坑
- OSS端对角色设置的自定义权限策略不清晰,可以对需要的角色添加AliyunOSSFullAccess权限
- endpoint基本固定,可以查看 help.aliyun.com/document_de…
- 浏览器端需要使用的accessKeyId和accessKeySecret 是sts接口返回的accessKeyId和accessKeySecret,不是固定的。
- 不建议把sts接口放在我们现在这样的工程结构的node端,会发送accessKeyId和accessKeySecret泄漏
- 分片上传OSS的接口不怎么稳定,建议增加超时时间,做好断点续传
- 分片大小需要经过测试后,可适当调节