upload.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * @Description: 统一上传工具,先获取uploadToken,再上传到新接口
  3. * @Author: Auto
  4. * @Date: 2024-01-01
  5. */
  6. // import axios from 'axios'
  7. // import Config from '../config'
  8. import axios from './axios.min.js'
  9. let ho = window.location.host.split('.')[1];
  10. let host80 = 'https://secure.' + ho + '.com';
  11. let host05 = 'https://file.' + ho + '.com';
  12. /**
  13. * 统一上传方法
  14. * @param {File} file - 要上传的文件
  15. * @param {String} originalUrl - 原上传接口URL(用于获取uploadToken)
  16. * @param {Object} headers - 请求头
  17. * @param {Function} onProgress - 上传进度回调
  18. * @returns {Promise} 上传结果
  19. */
  20. export async function unifiedUpload(file, originalUrl, headers = {}, 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. ...headers
  31. }
  32. // 获取基础URL
  33. let baseURL = host80
  34. // 提取原接口路径
  35. let originalPath = originalUrl
  36. if (originalUrl.startsWith('http://') || originalUrl.startsWith('https://')) {
  37. // 完整URL,提取路径部分
  38. const urlObj = new URL(originalUrl)
  39. originalPath = urlObj.pathname
  40. }
  41. // 调用原接口获取 uploadToken(先不传文件,只获取token)
  42. // 如果原接口需要文件才能返回token,则传文件
  43. const tokenFormData = new FormData()
  44. tokenFormData.append('file', file)
  45. const tokenResponse = await axios.post(originalPath, tokenFormData, {
  46. baseURL: baseURL,
  47. headers: requestHeaders,
  48. timeout: 30000,
  49. onUploadProgress: (progressEvent) => {
  50. if (onProgress && progressEvent.total) {
  51. const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total)
  52. onProgress({ percent })
  53. }
  54. }
  55. })
  56. // 从原接口响应中获取 uploadToken
  57. // 假设原接口返回格式为 { code: 200, data: { uploadToken: 'xxx', ... } } 或 { code: 200, uploadToken: 'xxx' }
  58. // let uploadToken = null
  59. // if (tokenResponse.data.code == 200) {
  60. // if (tokenResponse.data.data.path) {
  61. // // 如果直接返回 uploadToken
  62. // uploadToken = tokenResponse.data.data.path
  63. // }
  64. // }
  65. // if (!uploadToken) {
  66. // throw new Error('Failed to get uploadToken from original upload interface')
  67. // }
  68. // // 第二步:使用新接口上传文件
  69. // const uploadFormData = new FormData()
  70. // uploadFormData.append('file', file)
  71. // uploadFormData.append('uploadToken', uploadToken)
  72. // const uploadResponse = await axios.post('/common/base/upload', uploadFormData, {
  73. // baseURL: host05,
  74. // headers: requestHeaders,
  75. // timeout: 60000,
  76. // onUploadProgress: (progressEvent) => {
  77. // if (onProgress && progressEvent.total) {
  78. // const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total)
  79. // onProgress({ percent })
  80. // }
  81. // }
  82. // })
  83. // return uploadResponse.data
  84. if (tokenResponse.data.code == 200) {
  85. return tokenResponse.data
  86. }
  87. } catch (error) {
  88. console.error('Upload error:', error)
  89. if (error.response) {
  90. return {
  91. code: error.response.status || 400,
  92. msg: error.response.data?.msg || error.message || 'Upload failed'
  93. }
  94. }
  95. return {
  96. code: 400,
  97. msg: error.message || 'Upload failed'
  98. }
  99. }
  100. }
  101. /**
  102. * 为 Element UI Upload 组件创建自定义上传方法
  103. * @param {String} originalUrl - 原上传接口URL
  104. * @param {Object} headers - 请求头
  105. * @returns {Function} http-request 方法
  106. */
  107. export function createUploadRequest(originalUrl, headers = {}) {
  108. return async (options) => {
  109. const { file, onProgress, onSuccess, onError } = options
  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. }