方式一:postObject

https://help.aliyun.com/document_detail/31913.htm?spm=a2c4g.11186623.2.7.2ea61f52oujfWq#concept-pk1-sxl-vdb https://help.aliyun.com/document_detail/64047.html?spm=a2c4g.11186623.6.1230.2ea61f52oujfWq

上传的时候告诉OSS,你需要再下次访问的时候直接进行下载而不是预览,使用postObject方式进行上传,添加header如下,在下次直接访问该链接的时候,就是直接下载了:
image.png
字段说明:
Content-Disposition为属性名,disposition-type是以什么方式下载
如attachment为以附件方式下载disposition-parm为默认保存时的文件名服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment,后面跟的filename是下载文件的文件名称
当然filename参数可以包含路径信息,但User-Agnet会忽略掉这些信息,只会把路径信息的最后一部分做为文件名。
注意事项:
当代码里面使用Content-Disposition来确保浏览器弹出下载对话框的时候。 response.addHeader(“Content-Disposition”,”attachment”);一定要确保没有做过关于禁止浏览器缓存的操作。
不然会发现下载功能在opera和firefox里面好好的没问题,在IE下面就是不行。
image.png

方式二:STS临时授权方式

https://help.aliyun.com/document_detail/100624.html https://help.aliyun.com/document_detail/64052.html?spm=a2c4g.11186623.6.1231.41c343d3IKYolJ#title-p2y-k83-gaj

通过OSS发放临时token,对要访问的文件进行重命名,这个就需有后端的配合,因为一般OSS的签名都是有接口下发的,后端会生成一个访问token,前端拿到这个token后,请求OSS的重命名接口signatureUrl即可

  1. /**
  2. * @description: 下载的公共方法
  3. * @param {Object} client oss对象
  4. * @param {String} fileName 文件重命名名字
  5. * @param {String} fileExt 文件后缀
  6. * @param {String} fileUrl 文件存放路径
  7. * @return {String} 下载的url
  8. */
  9. cosnt downloadUrl = (client, fileName, fileUrl, fileExt) => {
  10. let name = fileExt ? `${encodeURIComponent(fileName)}.${fileExt}` : encodeURIComponent(fileName)
  11. const response = {
  12. 'content-disposition': `attachment;filename=${name}`
  13. }
  14. // object-key表示从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
  15. const url = client.signatureUrl(fileUrl, { response });
  16. return url;
  17. }

方式三:用ajax直接请求到文件流,再手动下载重命名

我们请求某一个文件的时候,可以通过修改responseType为blob的方式来进行文件流接收

  1. axios.get(url, {
  2. params,
  3. responseType: 'blob'
  4. });

然后将接收到的文件流进行重命名

  1. /**
  2. * 文件下载
  3. * @param {Blob} Blob对象
  4. * @param {String} fileName 导出的文件名
  5. */
  6. downloadFile(blob, fileName) {
  7. let url = URL.createObjectURL(blob);
  8. let a = document.createElement('a');
  9. a.style.display = 'none';
  10. a.href = url;
  11. a.setAttribute('download', fileName);
  12. document.body.appendChild(a);
  13. a.click();
  14. // 清楚数据
  15. document.body.removeChild(a);
  16. URL.revokeObjectURL(url);
  17. }