使用流行库

file-save.js ,兼容苹果,火狐,IE,谷歌浏览器;支持500M到1G

npm install ``file-saver --save

代码封装

  1. import Vue from "vue";
  2. import { saveAs } from "file-saver";
  3. import iconv from 'iconv-lite';//用于解决后端返回的中文乱码问题
  4. Vue.prototype.downloadcreateUrl = function(res, filename, type) {
  5. const content = res.data;// 注意查看conten的内容数据是否在content.data里
  6. let blob = "";
  7. let fileName = filename;
  8. if(content.type === 'text/xml'){ //返回错误信息提示
  9. let reader = new FileReader();
  10. reader.readAsText(blob);
  11. reader.onload = function () {
  12. console.log('reader',reader)
  13. let resData = JSON.parse(reader.result.toString());
  14. message.warning(resData || '找不到请求的资源' );
  15. return;
  16. };
  17. return ;
  18. }
  19. if(content.type === 'application/json'){ //返回错误信息提示
  20. let reader = new FileReader();
  21. reader.readAsText(res);
  22. reader.onload = function () {
  23. console.log('reader',reader)
  24. let resData = JSON.parse(reader.result.toString());
  25. SingleMessage.error(resData.message);
  26. return;
  27. };
  28. return ;
  29. }
  30. if (type == "word") {
  31. blob = new Blob([content], {
  32. type:
  33. "application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8"
  34. });
  35. } else if (type == "reportword") {
  36. blob = new Blob([content], {
  37. type:
  38. "application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8"
  39. });
  40. } else if (type == "zip") {
  41. blob = new Blob([content], { type: "application/zip;charset=UTF-8" });
  42. } else if (type == "pdf") {
  43. blob = new Blob([content], { type: "application/pdf;charset=UTF-8" });
  44. } else if (type == "xml") {
  45. blob = new Blob([content], { type: "application/xml;charset=UTF-8" });
  46. } else if (
  47. type == "rar" ||
  48. type == "xls" ||
  49. type == "xlsx" ||
  50. type == "csv" ||
  51. type == "dbf"
  52. ) {
  53. //没有指定MIME类型,通过文件名后缀定义下载文件类型
  54. blob = new Blob([content]);
  55. fileName = filename + "." + type;
  56. } else if (type == "dbf") {
  57. blob = new Blob([content], {
  58. type: "application/x-dbf;charset=UTF-8"
  59. });
  60. } else {
  61. //excel
  62. blob = new Blob([content], {
  63. type:
  64. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"
  65. });
  66. }
  67. console.log(content);
  68. // 有文件名就用自定义的,没有就从header获取
  69. if (!fileName) {
  70. fileName = fileNameFromHeader(content.headers["content-disposition"] || "");
  71. iconv.skipDecodeWarning = true;//忽略警告
  72. fileName = iconv.decode(fileName, 'utf-8');//解决中文乱码
  73. }
  74. console.log('downloadcreateUrl:',fileName)
  75. saveAs(blob, fileName);
  76. function fileNameFromHeader(disposition) {
  77. let result = null;
  78. disposition = disposition.split(";")[1];
  79. if (disposition && /filename=.*/gi.test(disposition)) {
  80. result = disposition.match(/filename=.*/gi);
  81. return decodeURIComponent(result[0].split("=")[1].replace(/\+/g, "%20"));
  82. }
  83. return "null";
  84. }
  85. };