upload.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * @Description: 统一上传工具,先获取uploadToken,再上传到新接口
  3. * @Author: Auto
  4. * @Date: 2024-01-01
  5. */
  6. import axios from 'axios'
  7. import Config from '../config'
  8. /**
  9. * 统一上传方法
  10. * @param {File} file - 要上传的文件
  11. * @param {String} originalUrl - 原上传接口URL(用于获取uploadToken)
  12. * @param {Object} headers - 请求头
  13. * @param {Function} onProgress - 上传进度回调
  14. * @returns {Promise} 上传结果
  15. */
  16. export async function unifiedUpload(file, originalUrl, headers = {}, onProgress = null, id = null) {
  17. try {
  18. // 第一步:调用原接口获取 uploadToken
  19. const formData = new FormData()
  20. formData.append('file', file)
  21. // 设置请求头
  22. const requestHeaders = {
  23. 'Access-Token': sessionStorage.getItem("access_token") || '',
  24. 'Language': sessionStorage.getItem("lang") || '',
  25. 'CLIENT': sessionStorage.getItem("CLIENT") || '',
  26. ...headers
  27. }
  28. // 获取基础URL
  29. let baseURL = Config.Host80
  30. if (originalUrl.includes(Config.Host80)) {
  31. baseURL = Config.Host80
  32. } else if (originalUrl.includes(Config.Host04)) {
  33. baseURL = Config.Host04
  34. } else if (originalUrl.includes(Config.Host90)) {
  35. baseURL = Config.Host90
  36. } else if (originalUrl.includes(Config.HostShop)) {
  37. baseURL = Config.HostShop
  38. } else if (originalUrl.includes(Config.Host87)) {
  39. baseURL = Config.Host87
  40. }
  41. // 提取原接口路径
  42. let originalPath = originalUrl
  43. if (originalUrl.startsWith('http://') || originalUrl.startsWith('https://')) {
  44. // 完整URL,提取路径部分
  45. const urlObj = new URL(originalUrl)
  46. originalPath = urlObj.pathname
  47. }
  48. // 调用原接口获取 uploadToken(先不传文件,只获取token)
  49. // 如果原接口需要文件才能返回token,则传文件
  50. const tokenFormData = new FormData()
  51. tokenFormData.append('file', file)
  52. const tokenResponse = await axios.post(originalPath, tokenFormData, {
  53. baseURL: baseURL,
  54. headers: requestHeaders,
  55. timeout: 30000
  56. })
  57. // 从原接口响应中获取 uploadToken
  58. // 假设原接口返回格式为 { code: 200, data: { uploadToken: 'xxx', ... } } 或 { code: 200, uploadToken: 'xxx' }
  59. let uploadToken = null
  60. if (tokenResponse.data.code == 200) {
  61. if(id === 1){
  62. uploadToken = tokenResponse.data.data
  63. }else {
  64. // 如果直接返回 uploadToken
  65. uploadToken = tokenResponse.data.data.path
  66. }
  67. }
  68. if (!uploadToken) {
  69. throw new Error('Failed to get uploadToken from original upload interface')
  70. }
  71. // 第二步:使用新接口上传文件
  72. const uploadFormData = new FormData()
  73. uploadFormData.append('file', file)
  74. uploadFormData.append('uploadToken', uploadToken)
  75. const uploadResponse = await axios.post('/common/base/upload', uploadFormData, {
  76. baseURL: Config.Host05,
  77. headers: requestHeaders,
  78. timeout: 60000,
  79. onUploadProgress: (progressEvent) => {
  80. if (onProgress && progressEvent.total) {
  81. const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total)
  82. onProgress({ percent })
  83. }
  84. }
  85. })
  86. return uploadResponse.data
  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 && 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 = {}, id = null) {
  108. return async (options) => {
  109. const { file, onProgress, onSuccess, onError } = options
  110. try {
  111. const result = await unifiedUpload(file, originalUrl, headers, onProgress, id)
  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. }