资源大致分为两种情况,
1.后台路径返回的流支持直接下载,类似2腾讯云服务器。
2. 路径访问的流不支持下载,但是可以预览。
常见的图片下载报错,统计如下
1.跨域导致下载失败,
2. 图片被缓存本地,第一次下载成功,二次下载失败,这个chrome 经常遇到
3.文件流格式问题,有时候服务器配置,或者后天提供了下载接口路径流转化格式问题,导致下载失败,或者下载文件乱码问题。
下面的方法就是通过前端的手段解决问题,注意如果遇到第三个问题,不要后台作作处理用正常浏览器可预览的路径即可,pdf 图片可以直接预览,其他格式是直接下载,使用该方法没有问题,
如果使用该方法,还不行,请留言,并附上路径
代码如下
**
* 根据文件url获取文件名
* @param url 文件url
*/
function getFileName(url) {
const num = url.lastIndexOf('/') + 1
let fileName = url.substring(num)
// 把参数和文件名分割开
fileName = decodeURI(fileName.split('?')[0])
return fileName
}
// 下载
export function exportFile(url) {
/**
* URL方式保存文件到本地
* @param data 文件的blob数据
* @param name 文件名
*/
function saveAs(data, name) {
const urlObject = window.URL || window.webkitURL || window
const export_blob = new Blob([data])
const save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
save_link.href = urlObject.createObjectURL(export_blob)
save_link.download = name
save_link.click()
}
url = url.replace(/\\/g, '/')
const xhr = new XMLHttpRequest()
if (url.indexOf('?') == -1) {
// 又丑又长防止重名
url = `${url}?timestamptmdtmdtmdtmdtmdtmdtmdtmd=${new Date().getTime()}`;
} else {
url = `${url}×tamptmdtmdtmdtmdtmdtmdtmdtmd=${new Date().getTime()}`;
}
xhr.open('GET', url, true)
xhr.responseType = 'blob'
xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
// xhr.setRequestHeader('Authorization', 'Basic a2VybWl0Omtlcm1pdA==');
xhr.onload = () => {
if (xhr.status === 200) {
// 获取文件blob数据并保存
const fileName = getFileName(url)
saveAs(xhr.response, fileName)
}
}
xhr.send()
}