方式一: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如下,在下次直接访问该链接的时候,就是直接下载了:
字段说明:
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下面就是不行。
方式二: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
即可
/**
* @description: 下载的公共方法
* @param {Object} client oss对象
* @param {String} fileName 文件重命名名字
* @param {String} fileExt 文件后缀
* @param {String} fileUrl 文件存放路径
* @return {String} 下载的url
*/
cosnt downloadUrl = (client, fileName, fileUrl, fileExt) => {
let name = fileExt ? `${encodeURIComponent(fileName)}.${fileExt}` : encodeURIComponent(fileName)
const response = {
'content-disposition': `attachment;filename=${name}`
}
// object-key表示从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
const url = client.signatureUrl(fileUrl, { response });
return url;
}
方式三:用ajax直接请求到文件流,再手动下载重命名
我们请求某一个文件的时候,可以通过修改responseType
为blob的方式来进行文件流接收
axios.get(url, {
params,
responseType: 'blob'
});
然后将接收到的文件流进行重命名
/**
* 文件下载
* @param {Blob} Blob对象
* @param {String} fileName 导出的文件名
*/
downloadFile(blob, fileName) {
let url = URL.createObjectURL(blob);
let a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.setAttribute('download', fileName);
document.body.appendChild(a);
a.click();
// 清楚数据
document.body.removeChild(a);
URL.revokeObjectURL(url);
}