upload.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*
  2. * @Description: 统一上传工具,先获取uploadToken,再上传到新接口
  3. * @Author: Auto
  4. * @Date: 2024-01-01
  5. */
  6. // axios 通过 <script> 标签在 HTML 中全局加载,直接使用全局变量
  7. let ho = window.location.host.split('.')[1];
  8. let host80 = 'https://secure.' + ho + '.com';
  9. let host05 = 'https://file.' + ho + '.com';
  10. /**
  11. * 统一上传方法
  12. * @param {File} file - 要上传的文件
  13. * @param {String} originalUrl - 原上传接口URL(用于获取uploadToken)
  14. * @param {Object} headers - 请求头
  15. * @param {Function} onProgress - 上传进度回调
  16. * @returns {Promise} 上传结果
  17. */
  18. async function unifiedUpload(file, originalUrl, headers, onProgress) {
  19. headers = headers || {};
  20. onProgress = onProgress || null;
  21. try {
  22. // 第一步:调用原接口获取 uploadToken
  23. const formData = new FormData()
  24. formData.append('file', file)
  25. // 设置请求头
  26. const requestHeaders = {
  27. 'Access-Token': sessionStorage.getItem("access_token") || '',
  28. 'Language': sessionStorage.getItem("lang") || '',
  29. 'CLIENT': sessionStorage.getItem("CLIENT") || ''
  30. };
  31. // ES5 方式合并 headers
  32. for (var key in headers) {
  33. if (headers.hasOwnProperty(key)) {
  34. requestHeaders[key] = headers[key];
  35. }
  36. }
  37. // 获取基础URL
  38. let baseURL = host80
  39. // 提取原接口路径
  40. let originalPath = originalUrl
  41. if (originalUrl.startsWith('http://') || originalUrl.startsWith('https://')) {
  42. // 完整URL,提取路径部分
  43. const urlObj = new URL(originalUrl)
  44. originalPath = urlObj.pathname
  45. }
  46. // 调用原接口获取 uploadToken(先不传文件,只获取token)
  47. // 如果原接口需要文件才能返回token,则传文件
  48. const tokenFormData = new FormData()
  49. tokenFormData.append('file', file)
  50. const tokenResponse = await window.axios.post(originalPath, tokenFormData, {
  51. baseURL: baseURL,
  52. headers: requestHeaders,
  53. timeout: 30000
  54. })
  55. // 从原接口响应中获取 uploadToken
  56. // 假设原接口返回格式为 { code: 200, data: { uploadToken: 'xxx', ... } } 或 { code: 200, uploadToken: 'xxx' }
  57. let uploadToken = null
  58. if (tokenResponse.data.code == 200) {
  59. if (tokenResponse.data.data.path) {
  60. // 如果直接返回 uploadToken
  61. uploadToken = tokenResponse.data.data.path
  62. }
  63. }
  64. if (!uploadToken) {
  65. throw new Error('Failed to get uploadToken from original upload interface')
  66. }
  67. // 第二步:使用新接口上传文件
  68. const uploadFormData = new FormData()
  69. uploadFormData.append('file', file)
  70. uploadFormData.append('uploadToken', uploadToken)
  71. const uploadResponse = await window.axios.post('/common/base/upload', uploadFormData, {
  72. baseURL: host05,
  73. headers: requestHeaders,
  74. timeout: 60000,
  75. onUploadProgress: (progressEvent) => {
  76. if (onProgress && progressEvent.total) {
  77. const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total)
  78. onProgress({ percent })
  79. }
  80. }
  81. })
  82. return uploadResponse.data
  83. } catch (error) {
  84. console.error('Upload error:', error)
  85. if (error.response) {
  86. return {
  87. code: error.response.status || 400,
  88. msg: (error.response.data && error.response.data.msg) || error.message || 'Upload failed'
  89. }
  90. }
  91. return {
  92. code: 400,
  93. msg: error.message || 'Upload failed'
  94. }
  95. }
  96. }
  97. /**
  98. * 为 Element UI Upload 组件创建自定义上传方法
  99. * @param {String} originalUrl - 原上传接口URL
  100. * @param {Object} headers - 请求头
  101. * @returns {Function} http-request 方法
  102. */
  103. function createUploadRequest(originalUrl, headers) {
  104. headers = headers || {};
  105. return async function(options) {
  106. const file = options.file;
  107. const onProgress = options.onProgress;
  108. const onSuccess = options.onSuccess;
  109. const onError = options.onError;
  110. try {
  111. const result = await unifiedUpload(file, originalUrl, headers, onProgress)
  112. if (result.code === 200) {
  113. onSuccess(result)
  114. } else {
  115. onError(new Error(result.msg || 'Upload failed'))
  116. }
  117. } catch (error) {
  118. onError(error)
  119. }
  120. }
  121. }
  122. // ES5 方式暴露到全局对象
  123. if (typeof window !== 'undefined') {
  124. window.createUploadRequest = createUploadRequest;
  125. }