DownloadService.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import Common from './Common.js';
  2. import Notify from './Notify.js';
  3. const showFullscreenLoading = () => {
  4. // 创建全屏遮罩
  5. const overlay = document.createElement('div');
  6. overlay.style.position = 'fixed';
  7. overlay.style.top = '0';
  8. overlay.style.left = '0';
  9. overlay.style.width = '100vw';
  10. overlay.style.height = '100vh';
  11. overlay.style.backgroundColor = '#96e5b8';
  12. overlay.style.zIndex = '9999';
  13. overlay.style.opacity = '0.6';
  14. overlay.style.display = 'flex';
  15. overlay.style.justifyContent = 'center';
  16. overlay.style.alignItems = 'center';
  17. overlay.id = 'fullscreen-loading';
  18. // 创建旋转动画元素
  19. const spinner = document.createElement('div');
  20. spinner.style.width = '50px';
  21. spinner.style.height = '50px';
  22. spinner.style.border = '5px solid rgb(20, 214, 140)';
  23. spinner.style.borderRadius = '50%';
  24. spinner.style.opacity = '1';
  25. spinner.style.borderTopColor = '#fff';
  26. spinner.style.animation = 'spin 1s linear infinite';
  27. // 添加CSS动画关键帧
  28. const style = document.createElement('style');
  29. style.textContent = `
  30. @keyframes spin {
  31. to { transform: rotate(360deg); }
  32. }
  33. `;
  34. overlay.appendChild(spinner);
  35. document.body.appendChild(style);
  36. document.body.appendChild(overlay);
  37. };
  38. const hideFullscreenLoading = () => {
  39. const overlay = document.getElementById('fullscreen-loading');
  40. if (overlay) {
  41. overlay.remove();
  42. // 移除动态添加的style标签
  43. document.querySelector('style').remove();
  44. }
  45. };
  46. /**
  47. * 报表下载服务
  48. */
  49. export default {
  50. /**
  51. * GET 方式下载文件
  52. * @param {*} url
  53. * @param {*} fileName
  54. */
  55. downloadFile: function (url, fileName) {
  56. var xhr = new XMLHttpRequest();
  57. xhr.open('get', url, true);
  58. const token = localStorage.getItem('#token');
  59. xhr.setRequestHeader('token', token);
  60. xhr.setRequestHeader('Content-type', 'application/json');
  61. xhr.responseType = 'blob';
  62. showFullscreenLoading();
  63. xhr.onreadystatechange = function () {
  64. if (xhr.readyState === 4) {
  65. if (xhr.status === 200) {
  66. let res = xhr.response;
  67. let type = xhr.getResponseHeader('Content-Type');
  68. let blob = new Blob([res], { type: type });
  69. const blobUrl = URL.createObjectURL(blob);
  70. const link = document.createElement('a');
  71. link.download = fileName;
  72. link.style.display = 'none';
  73. link.href = blobUrl;
  74. document.body.appendChild(link);
  75. link.click();
  76. URL.revokeObjectURL(blobUrl);
  77. document.body.removeChild(link);
  78. }
  79. hideFullscreenLoading();
  80. }
  81. };
  82. xhr.onerror = function () {
  83. hideFullscreenLoading();
  84. Notify.error('文件下载失败');
  85. };
  86. xhr.send();
  87. },
  88. /**
  89. * 报表下载
  90. * @param {Object} fileName
  91. * @author GuoZhiBo 20200410
  92. */
  93. reportDownload: function (fileName) {
  94. var downloadUrl = Common.getApiURL('file/reportDownload') + '?fileName=' + window.encodeURIComponent(fileName);
  95. this.downloadFile(downloadUrl, fileName);
  96. },
  97. /**
  98. * 文件下载
  99. * @param {Object} className 类名称
  100. * @param {Object} fileName 文件名称
  101. * @author GuoZhiBo 20211008
  102. */
  103. fileDownload: function (className, fileName) {
  104. var downloadUrl = Common.getApiURL('file/fileDownload') + '?className=' + className
  105. + '&fileName=' + window.encodeURIComponent(fileName);
  106. this.downloadFile(downloadUrl, fileName);
  107. },
  108. /**
  109. * POST 方式下载文件
  110. * @param {http请求的地址} url
  111. * @param {post请求需要的参数} params
  112. */
  113. postDownloadFile: function (url, params) {
  114. var form = document.createElement('form');
  115. form.style.display = 'none';
  116. form.action = url;
  117. form.method = 'post';
  118. document.body.appendChild(form);
  119. // 动态创建input并给value赋值
  120. for (var key in params) {
  121. var input = document.createElement('input');
  122. input.type = 'hidden';
  123. input.name = key;
  124. input.value = params[key];
  125. form.appendChild(input);
  126. }
  127. form.submit();
  128. form.remove();
  129. },
  130. };