zipdownload.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import axios from 'axios'
  2. import {baseURL, getToken} from "/@/utils/gfast"
  3. import { ElMessage,ElLoading } from 'element-plus';
  4. const mimeMap = {
  5. xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  6. zip: 'application/zip'
  7. }
  8. const baseUrl = import.meta.env.VITE_API_URL
  9. export function downLoadZip(str:string, filename:string) {
  10. var url = baseUrl + str
  11. axios({
  12. method: 'get',
  13. url: url,
  14. responseType: 'blob',
  15. headers: { 'Authorization': 'Bearer ' + getToken() }
  16. }).then(res => {
  17. if(filename){
  18. res.headers['content-disposition'] = 'attachment; filename='+filename;
  19. }
  20. resolveBlob(res, mimeMap.zip)
  21. })
  22. }
  23. const getHost = ():string=>{
  24. return window.location.origin
  25. }
  26. // 下载插件
  27. export function downLoadXml (url:string,params:any,rType='get') {
  28. if (baseUrl=='' ||baseURL=='/'){
  29. url = getHost() + url
  30. }else{
  31. url = baseUrl + url
  32. }
  33. const loading = ElLoading.service({
  34. lock: true,
  35. text: '正在生成导出数据...',
  36. spinner: 'el-icon-loading',
  37. background: 'rgba(0, 0, 0, 0.7)'
  38. })
  39. let option = {
  40. url: url,
  41. params:params,
  42. timeout:300000,
  43. method: 'get',
  44. responseType: 'blob',
  45. headers: { 'Authorization': 'Bearer ' + getToken() }
  46. }
  47. if(rType=='post'){
  48. option = {
  49. url: url,
  50. data:params,
  51. timeout:300000,
  52. method: 'post',
  53. responseType: 'blob',
  54. headers: { 'Authorization': 'Bearer ' + getToken() }
  55. }
  56. }
  57. axios(option).then(res => {
  58. loading.close()
  59. if (res.status !== 200) {
  60. ElMessage({
  61. message: '发生错误,导出失败。',
  62. type: 'error'
  63. })
  64. return
  65. }
  66. try {
  67. const aLink = document.createElement('a')
  68. var blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
  69. var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
  70. var contentDisposition = decodeURI(res.headers['content-disposition'] || res.headers['Content-Disposition'])
  71. var result = patt.exec(contentDisposition)
  72. var fileName = result[1]
  73. fileName = fileName.replace(/"/g, '')
  74. aLink.href = URL.createObjectURL(blob)
  75. aLink.setAttribute('download', fileName) // 设置下载文件名称
  76. document.body.appendChild(aLink)
  77. aLink.click()
  78. document.body.appendChild(aLink)
  79. } catch (e) {
  80. console.log(e)
  81. ElMessage({
  82. message: '下载失败,可能您登录状态过期,请重新登录后下载。',
  83. type: 'error'
  84. })
  85. }
  86. }).catch(e=>{
  87. console.log(e)
  88. loading.close()
  89. ElMessage({
  90. message: '导出失败',
  91. type: 'error'
  92. })
  93. })
  94. }
  95. /**
  96. * 解析blob响应内容并下载
  97. * @param {*} res blob响应内容
  98. * @param {String} mimeType MIME类型
  99. */
  100. export function resolveBlob(res: any, mimeType:any) {
  101. const aLink = document.createElement('a')
  102. var blob = new Blob([res.data], { type: mimeType })
  103. // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
  104. var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
  105. var contentDisposition = decodeURI(res.headers['content-disposition']||res.headers['Content-Disposition'])
  106. var result = patt.exec(contentDisposition)
  107. var fileName = result[1]
  108. fileName = fileName.replace(/\"/g, '')
  109. aLink.href = URL.createObjectURL(blob)
  110. aLink.setAttribute('download', fileName) // 设置下载文件名称
  111. document.body.appendChild(aLink)
  112. aLink.click()
  113. document.body.appendChild(aLink)
  114. }