使用流行库
file-save.js ,兼容苹果,火狐,IE,谷歌浏览器;支持500M到1G
npm install ``file-saver --save
代码封装
import Vue from "vue";
import { saveAs } from "file-saver";
import iconv from 'iconv-lite';//用于解决后端返回的中文乱码问题
Vue.prototype.downloadcreateUrl = function(res, filename, type) {
const content = res.data;// 注意查看conten的内容数据是否在content.data里
let blob = "";
let fileName = filename;
if(content.type === 'text/xml'){ //返回错误信息提示
let reader = new FileReader();
reader.readAsText(blob);
reader.onload = function () {
console.log('reader',reader)
let resData = JSON.parse(reader.result.toString());
message.warning(resData || '找不到请求的资源' );
return;
};
return ;
}
if(content.type === 'application/json'){ //返回错误信息提示
let reader = new FileReader();
reader.readAsText(res);
reader.onload = function () {
console.log('reader',reader)
let resData = JSON.parse(reader.result.toString());
SingleMessage.error(resData.message);
return;
};
return ;
}
if (type == "word") {
blob = new Blob([content], {
type:
"application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8"
});
} else if (type == "reportword") {
blob = new Blob([content], {
type:
"application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8"
});
} else if (type == "zip") {
blob = new Blob([content], { type: "application/zip;charset=UTF-8" });
} else if (type == "pdf") {
blob = new Blob([content], { type: "application/pdf;charset=UTF-8" });
} else if (type == "xml") {
blob = new Blob([content], { type: "application/xml;charset=UTF-8" });
} else if (
type == "rar" ||
type == "xls" ||
type == "xlsx" ||
type == "csv" ||
type == "dbf"
) {
//没有指定MIME类型,通过文件名后缀定义下载文件类型
blob = new Blob([content]);
fileName = filename + "." + type;
} else if (type == "dbf") {
blob = new Blob([content], {
type: "application/x-dbf;charset=UTF-8"
});
} else {
//excel
blob = new Blob([content], {
type:
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"
});
}
console.log(content);
// 有文件名就用自定义的,没有就从header获取
if (!fileName) {
fileName = fileNameFromHeader(content.headers["content-disposition"] || "");
iconv.skipDecodeWarning = true;//忽略警告
fileName = iconv.decode(fileName, 'utf-8');//解决中文乱码
}
console.log('downloadcreateUrl:',fileName)
saveAs(blob, fileName);
function fileNameFromHeader(disposition) {
let result = null;
disposition = disposition.split(";")[1];
if (disposition && /filename=.*/gi.test(disposition)) {
result = disposition.match(/filename=.*/gi);
return decodeURIComponent(result[0].split("=")[1].replace(/\+/g, "%20"));
}
return "null";
}
};