fix(upload): use stable file proxy urls after client upload

pull/874/head
Codewoc 2026-03-30 09:54:58 +08:00
parent 8d2964afac
commit fa7d1f81d8
1 changed files with 18 additions and 7 deletions

View File

@ -5,6 +5,7 @@ import {
UploadProgressEvent UploadProgressEvent
} from 'element-plus/es/components/upload/src/upload' } from 'element-plus/es/components/upload/src/upload'
import axios, { AxiosProgressEvent } from 'axios' import axios, { AxiosProgressEvent } from 'axios'
import { config } from '@/config/axios/config'
/** /**
* URL * URL
@ -33,6 +34,7 @@ export const useUpload = (directory?: string) => {
const fileName = options.file.name || options.filename const fileName = options.file.name || options.filename
// 1.2 获取文件预签名地址 // 1.2 获取文件预签名地址
const presignedInfo = await FileApi.getFilePresignedUrl(fileName, directory) const presignedInfo = await FileApi.getFilePresignedUrl(fileName, directory)
const fileAccessUrl = buildFileAccessUrl(presignedInfo.configId, presignedInfo.path)
// 1.3 上传文件(不能使用 ElUpload 的 ajaxUpload 方法的原因:其使用的是 FormData 上传Minio 不支持) // 1.3 上传文件(不能使用 ElUpload 的 ajaxUpload 方法的原因:其使用的是 FormData 上传Minio 不支持)
return axios return axios
.put(presignedInfo.uploadUrl, options.file, { .put(presignedInfo.uploadUrl, options.file, {
@ -41,11 +43,11 @@ export const useUpload = (directory?: string) => {
}, },
onUploadProgress: uploadProgressHandler onUploadProgress: uploadProgressHandler
}) })
.then(() => { .then(async () => {
// 1.4. 记录文件信息到后端(异步) // 1.4. 记录文件信息到后端(异步)
createFile(presignedInfo, options.file, fileName) await createFile(presignedInfo, options.file, fileName, fileAccessUrl)
// 通知成功,数据格式保持与后端上传的返回结果一致 // 通知成功,数据格式保持与后端上传的返回结果一致
return { data: presignedInfo.url } return { data: fileAccessUrl }
}) })
} else { } else {
// 模式二:后端上传 // 模式二:后端上传
@ -78,17 +80,26 @@ export const useUpload = (directory?: string) => {
* @param file * @param file
* @param fileName * @param fileName
*/ */
function createFile(vo: FileApi.FilePresignedUrlRespVO, file: UploadRawFile, fileName: string) { function createFile(
vo: FileApi.FilePresignedUrlRespVO,
file: UploadRawFile,
fileName: string,
url: string
) {
const fileVo = { const fileVo = {
configId: vo.configId, configId: vo.configId,
url: vo.url, url,
path: vo.path, path: vo.path,
name: fileName, name: fileName,
type: file.type || 'application/octet-stream', type: file.type || 'application/octet-stream',
size: file.size size: file.size
} }
FileApi.createFile(fileVo) return FileApi.createFile(fileVo)
return fileVo }
function buildFileAccessUrl(configId: number, path: string) {
const base = window.location.origin + config.base_url
return `${base}/infra/file/${configId}/get/${encodeURI(path)}`
} }
/** /**