Commit 4389af5b by 王立鹏

Merge branch '线上优化/修复视频上传重名问题' into 'master'

线上优化/修复视频上传重名问题

See merge request !36
parents d66ac723 9b374de1
...@@ -86,6 +86,18 @@ async function fileHashHeadTailMiddle(file: File, chunkSize = 1024 * 1024) { ...@@ -86,6 +86,18 @@ async function fileHashHeadTailMiddle(file: File, chunkSize = 1024 * 1024) {
return CryptoJS.MD5(finalHashes.join('')).toString(CryptoJS.enc.Hex) 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数组 // 将文件进行分片 返回一个Blob数组
function createChunks(file: File, chunkSize: number) { function createChunks(file: File, chunkSize: number) {
const chunks: Blob[] = [] const chunks: Blob[] = []
...@@ -122,12 +134,14 @@ async function uploadFileByChunks( ...@@ -122,12 +134,14 @@ async function uploadFileByChunks(
const { onProgress } = options const { onProgress } = options
const fileHash = await fileHashHeadTailMiddle(file) const fileHash = await fileHashHeadTailMiddle(file)
const fileSuffix = file.name.includes('.') ? file.name.slice(file.name.lastIndexOf('.')) : '' 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 }>( const checkResponse = await axios.post<{ data: ChunkCheckResponse }>(
`${resolveUploadBaseUrl()}/mobiles/file-upload/check`, `${resolveUploadBaseUrl()}/mobiles/file-upload/check`,
{ {
hash: fileHash, hash: fileHash,
fileName: file.name, fileName: uploadFileName,
fileSize: file.size, fileSize: file.size,
fileSuffx: fileSuffix, fileSuffx: fileSuffix,
}, },
...@@ -207,7 +221,7 @@ async function uploadFileByChunks( ...@@ -207,7 +221,7 @@ async function uploadFileByChunks(
) )
const finishFormData = new FormData() const finishFormData = new FormData()
finishFormData.set('fileName', file.name) finishFormData.set('fileName', uploadFileName)
finishFormData.set('fileId', fileHash) finishFormData.set('fileId', fileHash)
finishFormData.set('chunkTotalCount', String(totalChunks)) finishFormData.set('chunkTotalCount', String(totalChunks))
......
...@@ -570,10 +570,11 @@ const rules = { ...@@ -570,10 +570,11 @@ const rules = {
const tansformData = (releaseStatus: ReleaseStatusTypeEnum): AddOrUpdateVideoDto => { const tansformData = (releaseStatus: ReleaseStatusTypeEnum): AddOrUpdateVideoDto => {
const data = { const data = {
...form.value, ...form.value,
tagList: [form.value.mainTagId, ...form.value.tagList].map((item, index) => ({ // 过滤掉空标签 防止脏值打到后端导致整篇保存失败
tagId: Number(item), tagList: [form.value.mainTagId, ...form.value.tagList]
sort: index, .map(Number)
})), .filter((tagId) => Number.isInteger(tagId) && tagId > 0)
.map((tagId, index) => ({ tagId, sort: index })),
mainTagId: Number(form.value.mainTagId), mainTagId: Number(form.value.mainTagId),
releaseStatus, releaseStatus,
} }
...@@ -669,8 +670,8 @@ onActivated(async () => { ...@@ -669,8 +670,8 @@ onActivated(async () => {
form.value = { form.value = {
...form.value, ...form.value,
...data, ...data,
mainTagId: String(data.tagIdList?.[0]), mainTagId: data.tagIdList?.[0] ? String(data.tagIdList[0]) : '',
tagList: data.tagIdList?.slice(1), tagList: data.tagIdList?.slice(1) || [],
} }
// 回显推送的部门 这个后端没有返回相关数据 需要返回 // 回显推送的部门 这个后端没有返回相关数据 需要返回
if (data.pushList?.find((item) => item.valueId == '1')) { if (data.pushList?.find((item) => item.valueId == '1')) {
......
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