前端js直接上传阿里云OSS说明文档

5,077 阅读2分钟

一 、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端设置

三、服务端临时授权接口

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) 
})

四、遇到的坑

  • OSS端对角色设置的自定义权限策略不清晰,可以对需要的角色添加AliyunOSSFullAccess权限
  • endpoint基本固定,可以查看 help.aliyun.com/document_de…
  • 浏览器端需要使用的accessKeyId和accessKeySecret 是sts接口返回的accessKeyId和accessKeySecret,不是固定的。
  • 不建议把sts接口放在我们现在这样的工程结构的node端,会发送accessKeyId和accessKeySecret泄漏
  • 分片上传OSS的接口不怎么稳定,建议增加超时时间,做好断点续传
  • 分片大小需要经过测试后,可适当调节