This commit is contained in:
itcsx committed 2026-09-21 23:15:49 +08:00
1 parent 70b3e19798
commit 9b9f07dea5
5 files changed
+167 -34

No files matched your search

+56 -4
View File
@@ -201,6 +201,7 @@ const toUploadView = (r: Record<string, any>): DmsFileUploadViewDisplayData =>
onUnmounted(() => {
sound.value?.stop();
clearRefreshTimers();
stopTranscodeTip();
});
const play = (src: string) => {
@@ -298,16 +299,58 @@ const resolveUploadFilePath = () => {
return bindOption?.Value || currFilePath.value;
};
const onUploadStart = () => {
loading.value = true;
/** 本次上传的是否是视频:只有视频才需要转码/截图 */
const uploadingVideo = ref<boolean>(false);
/**
* "视频转码中 x%" 提示。
*
* 最后一片发出去后,服务端要先 ffmpeg 截封面(要解码一段视频,最多 25 秒)才返回,
* 这段时间前端进度停在 99%/100% 一动不动,看起来像卡死。
* 这里用一个按时间推进的估算进度(与后端 25 秒上限对齐,最高 99%)告诉用户还在处理。
*/
const TRANSCODE_MAX_MS = 25000;
let transcodeTimer = 0;
const startTranscodeTip = () => {
if (transcodeTimer) return;
const startAt = Date.now();
spinTip.value = "预览10秒视频转码中 0%";
transcodeTimer = window.setInterval(() => {
const ratio = Math.min(0.99, (Date.now() - startAt) / TRANSCODE_MAX_MS);
spinTip.value = `预览10秒视频转码中 ${Math.round(ratio * 100)}%`;
}, 300);
};
const onUploadProgress = (payload: { text?: string }) => {
const stopTranscodeTip = () => {
if (!transcodeTimer) return;
clearInterval(transcodeTimer);
transcodeTimer = 0;
};
const onUploadStart = (file: File) => {
loading.value = true;
uploadingVideo.value = !!file && fileTypePolicy.isVideo(file?.name || "");
};
const onUploadProgress = (payload: { text?: string; percent?: number }) => {
// 99%/100% 之后就是服务端转码阶段,换成转码提示,别让用户以为卡住了
if (uploadingVideo.value && (payload?.percent ?? 0) >= 99) {
startTranscodeTip();
return;
}
// 进度回到低处说明开始传下一个文件了,转码提示到此为止
stopTranscodeTip();
spinTip.value = payload?.text || "上传中...";
};
/** 单个文件传完:这里不刷新,等一批都传完再统一刷,避免选了多个文件反复刷列表 */
const onUploadSuccess = () => {
// 字节已传完,服务端还在合并分片 + ffmpeg 截图/转码
if (uploadingVideo.value) {
startTranscodeTip();
return;
}
spinTip.value = "上传完成,等待服务端处理...";
};
@@ -326,11 +369,15 @@ const clearRefreshTimers = () => {
const onUploadComplete = (payload: { count?: number }) => {
const count = payload?.count ?? 1;
const sec = 2500 + (count - 1) * 1000;
spinTip.value = "加载中...";
// 视频场景由转码提示接管文案,等首刷完成后再切回"加载中..."
if (!uploadingVideo.value) spinTip.value = "加载中...";
clearRefreshTimers();
refreshTimers.push(
window.setTimeout(() => {
// 列表已经刷出来了,转码提示到此为止(后续补刷沿用默认的"加载中...")
stopTranscodeTip();
uploadingVideo.value = false;
onReSearch();
loading.value = false;
}, sec),
@@ -359,6 +406,7 @@ const onUploadInterrupted = (payload: {
uploaded: payload?.uploaded ?? 0,
total: payload?.total ?? 0,
};
stopTranscodeTip();
loading.value = false;
spinTip.value = "加载中...";
showResumeModal.value = true;
@@ -376,10 +424,14 @@ const onResumeUpload = () => {
const onDiscardUpload = () => {
showResumeModal.value = false;
operatorStationRef.value?.discardUpload();
stopTranscodeTip();
uploadingVideo.value = false;
loading.value = false;
};
const onUploadError = () => {
stopTranscodeTip();
uploadingVideo.value = false;
loading.value = false;
spinTip.value = "加载中...";
};