fix(upload): use stable file proxy urls after client upload
parent
8d2964afac
commit
fa7d1f81d8
|
|
@ -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)}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue