| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /*
- * @Description: 统一上传工具,先获取uploadToken,再上传到新接口
- * @Author: Auto
- * @Date: 2024-01-01
- */
- import axios from 'axios'
- import Config from '../config'
- /**
- * 统一上传方法
- * @param {File} file - 要上传的文件
- * @param {String} originalUrl - 原上传接口URL(用于获取uploadToken)
- * @param {Object} headers - 请求头
- * @param {Function} onProgress - 上传进度回调
- * @returns {Promise} 上传结果
- */
- export async function unifiedUpload(file, originalUrl, headers = {}, onProgress = null, id = null) {
- try {
- // 第一步:调用原接口获取 uploadToken
- const formData = new FormData()
- formData.append('file', file)
-
- // 设置请求头
- const requestHeaders = {
- 'Access-Token': sessionStorage.getItem("access_token") || '',
- 'Language': sessionStorage.getItem("lang") || '',
- 'CLIENT': sessionStorage.getItem("CLIENT") || '',
- ...headers
- }
-
- // 获取基础URL
- let baseURL = Config.Host80
- if (originalUrl.includes(Config.Host80)) {
- baseURL = Config.Host80
- } else if (originalUrl.includes(Config.Host04)) {
- baseURL = Config.Host04
- } else if (originalUrl.includes(Config.Host90)) {
- baseURL = Config.Host90
- } else if (originalUrl.includes(Config.HostShop)) {
- baseURL = Config.HostShop
- } else if (originalUrl.includes(Config.Host87)) {
- baseURL = Config.Host87
- }
-
- // 提取原接口路径
- let originalPath = originalUrl
- if (originalUrl.startsWith('http://') || originalUrl.startsWith('https://')) {
- // 完整URL,提取路径部分
- const urlObj = new URL(originalUrl)
- originalPath = urlObj.pathname
- }
-
- // 调用原接口获取 uploadToken(先不传文件,只获取token)
- // 如果原接口需要文件才能返回token,则传文件
- const tokenFormData = new FormData()
- tokenFormData.append('file', file)
-
- const tokenResponse = await axios.post(originalPath, tokenFormData, {
- baseURL: baseURL,
- headers: requestHeaders,
- timeout: 30000
- })
-
- // 从原接口响应中获取 uploadToken
- // 假设原接口返回格式为 { code: 200, data: { uploadToken: 'xxx', ... } } 或 { code: 200, uploadToken: 'xxx' }
- let uploadToken = null
- if (tokenResponse.data.code == 200) {
- if(id === 1){
- uploadToken = tokenResponse.data.data
- }else {
- // 如果直接返回 uploadToken
- uploadToken = tokenResponse.data.data.path
- }
- }
-
- if (!uploadToken) {
- throw new Error('Failed to get uploadToken from original upload interface')
- }
-
- // 第二步:使用新接口上传文件
- const uploadFormData = new FormData()
- uploadFormData.append('file', file)
- uploadFormData.append('uploadToken', uploadToken)
-
- const uploadResponse = await axios.post('/common/base/upload', uploadFormData, {
- baseURL: Config.Host05,
- headers: requestHeaders,
- timeout: 60000,
- onUploadProgress: (progressEvent) => {
- if (onProgress && progressEvent.total) {
- const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total)
- onProgress({ percent })
- }
- }
- })
-
- return uploadResponse.data
-
- } catch (error) {
- console.error('Upload error:', error)
- if (error.response) {
- return {
- code: error.response.status || 400,
- msg: (error.response.data && error.response.data.msg) || error.message || 'Upload failed'
- }
- }
- return {
- code: 400,
- msg: error.message || 'Upload failed'
- }
- }
- }
- /**
- * 为 Element UI Upload 组件创建自定义上传方法
- * @param {String} originalUrl - 原上传接口URL
- * @param {Object} headers - 请求头
- * @returns {Function} http-request 方法
- */
- export function createUploadRequest(originalUrl, headers = {}, id = null) {
- return async (options) => {
- const { file, onProgress, onSuccess, onError } = options
-
- try {
- const result = await unifiedUpload(file, originalUrl, headers, onProgress, id)
-
- if (result.code === 200) {
- onSuccess(result)
- } else {
- onError(new Error(result.msg || 'Upload failed'))
- }
- } catch (error) {
- onError(error)
- }
- }
- }
|