赞
踩
问题描述:在项目中写了个文件流形式的公共下载函数,但是发现下载大文件时,出现了“假死”现象,点击下载之后半天没反应,于是又改成a标签点击链接下载,但是遇到跨域文件无法重命名问题。
将文件以文件流形式下载浏览器之后,再以此文件流为a标签中的href,模拟点击下载。
缺点:
网上已有大量该下载代码,这里贴一个网上的代码:
/**
* 文件下载重命名,根据依赖file-saver改写
*/
/**
* 获取 blob
* @param {String} url 目标文件地址
* @return {cb}
*/
export function getBlob(url, cb) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "blob";
xhr.onload = function () {
if (xhr.status === 200) {
cb(xhr.response);
}
};
xhr.send();
}
/**
* 保存
* @param {Blob} blob
* @param {String} filename 想要保存的文件名称
*/
export function saveAs(blob, filename) {
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, filename);
} else {
var link = document.createElement("a");
var body = document.querySelector("body");
link.href = window.URL.createObjectURL(blob);
link.download = filename;
// fix Firefox
link.style.display = "none";
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
}
}
/**
* 下载
* @param {String} url 目标文件地址
* @param {String} filename 想要保存的文件名称
*/
export function renameDownload(url, filename) {
getBlob(url, function (blob) {
saveAs(blob, filename);
});
}
a标签点击链接下载。
缺点:
解决方案:
但是这些问题可以通过添加header来解决,但具体是否所有浏览器都兼容,以及安全问题,本人没有深究。
下边贴代码:
/**
* 下载
* @param {String} fileUrl 目标文件地址
* @param {String} filename 想要保存的文件名称
*/
export function renameDownload(fileUrl, fileName) {
let link = document.createElement("a");
//这里属性涉及到跨域问题后,设置无效
//link.download = fileName;
link.style.display = "none";
//response-content-type=application/octet-stream,这里是为了防止图片,pdf,txt文件直接被浏览器打开
//response-content-disposition的设置,解决跨域文件名重命名无效问题,encodeURIComponent防止文件名带特殊字符(例如&等)导致下载文件名出问题
link.href =
fileUrl +
"?response-content-type=application/octet-stream&response-content-disposition=filename=" +
${encodeURIComponent(fileName)};
document.body.appendChild(link);
link.click();
URL.revokeObjectURL(link.href);
document.body.removeChild(link, fileName);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。