Commit 1084a2b4 by lijiabin

fix: 分片上传是文件名字带上hash防止重名

parent d66ac723
......@@ -86,6 +86,18 @@ async function fileHashHeadTailMiddle(file: File, chunkSize = 1024 * 1024) {
return CryptoJS.MD5(finalHashes.join('')).toString(CryptoJS.enc.Hex)
}
// 给文件名拼上 hash 避免不同文件重名互相覆盖 例如 a.mp4 -> a_5d41402a....mp4
// 同一个文件的 hash 是稳定的 所以秒传和断点续传拿到的仍然是同一个文件名
function buildUniqueFileName(fileName: string, fileHash: string) {
const dotIndex = fileName.lastIndexOf('.')
// 没有后缀 或者以 . 开头的隐藏文件 直接拼在末尾
if (dotIndex <= 0) return `${fileName}_${fileHash}`
const baseName = fileName.slice(0, dotIndex)
const suffix = fileName.slice(dotIndex)
return `${baseName}_${fileHash}${suffix}`
}
// 将文件进行分片 返回一个Blob数组
function createChunks(file: File, chunkSize: number) {
const chunks: Blob[] = []
......@@ -122,12 +134,14 @@ async function uploadFileByChunks(
const { onProgress } = options
const fileHash = await fileHashHeadTailMiddle(file)
const fileSuffix = file.name.includes('.') ? file.name.slice(file.name.lastIndexOf('.')) : ''
// 上传到服务端用的文件名 带上 hash 防止重名覆盖
const uploadFileName = buildUniqueFileName(file.name, fileHash)
const checkResponse = await axios.post<{ data: ChunkCheckResponse }>(
`${resolveUploadBaseUrl()}/mobiles/file-upload/check`,
{
hash: fileHash,
fileName: file.name,
fileName: uploadFileName,
fileSize: file.size,
fileSuffx: fileSuffix,
},
......@@ -207,7 +221,7 @@ async function uploadFileByChunks(
)
const finishFormData = new FormData()
finishFormData.set('fileName', file.name)
finishFormData.set('fileName', uploadFileName)
finishFormData.set('fileId', fileHash)
finishFormData.set('chunkTotalCount', String(totalChunks))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment