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) {
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))
......
......@@ -570,10 +570,11 @@ const rules = {
const tansformData = (releaseStatus: ReleaseStatusTypeEnum): AddOrUpdateVideoDto => {
const data = {
...form.value,
tagList: [form.value.mainTagId, ...form.value.tagList].map((item, index) => ({
tagId: Number(item),
sort: index,
})),
// 过滤掉空标签 防止脏值打到后端导致整篇保存失败
tagList: [form.value.mainTagId, ...form.value.tagList]
.map(Number)
.filter((tagId) => Number.isInteger(tagId) && tagId > 0)
.map((tagId, index) => ({ tagId, sort: index })),
mainTagId: Number(form.value.mainTagId),
releaseStatus,
}
......@@ -669,8 +670,8 @@ onActivated(async () => {
form.value = {
...form.value,
...data,
mainTagId: String(data.tagIdList?.[0]),
tagList: data.tagIdList?.slice(1),
mainTagId: data.tagIdList?.[0] ? String(data.tagIdList[0]) : '',
tagList: data.tagIdList?.slice(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