|
|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
<template> |
|
|
|
|
<div> |
|
|
|
|
<el-upload |
|
|
|
|
ref="uploadRef" |
|
|
|
|
:action="`${BASE_PATH}/file/upload`" |
|
|
|
|
:headers="{ Authorization: getToken() }" |
|
|
|
|
multiple |
|
|
|
|
@ -55,10 +56,13 @@ const props = defineProps({
|
|
|
|
|
|
|
|
|
|
const emit = defineEmits(["update:files"]); |
|
|
|
|
|
|
|
|
|
const uploadRef = ref(); |
|
|
|
|
const files = ref(props.files); |
|
|
|
|
const allowArchiveFallback = ref(false); |
|
|
|
|
const fallbackArchiveExts = ['zip', 'rar', '7z']; |
|
|
|
|
const archiveExts = [...fallbackArchiveExts, 'tar', 'gz', 'bz2', 'xz', 'iso', 'dmg']; |
|
|
|
|
const pdfResponseTimeout = 15000; |
|
|
|
|
const responseTimers = new Map(); |
|
|
|
|
|
|
|
|
|
function getFileExt(file) { |
|
|
|
|
const name = (file?.name || file?.raw?.name || '').toLowerCase(); |
|
|
|
|
@ -74,6 +78,31 @@ function enableArchiveFallback(file) {
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function clearResponseTimer(file) { |
|
|
|
|
const timer = responseTimers.get(file?.uid); |
|
|
|
|
if (timer) { |
|
|
|
|
window.clearTimeout(timer); |
|
|
|
|
} |
|
|
|
|
responseTimers.delete(file?.uid); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function startPdfResponseTimer(file) { |
|
|
|
|
if (getFileExt(file) !== 'pdf' || responseTimers.has(file?.uid)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
const timer = window.setTimeout(() => { |
|
|
|
|
responseTimers.delete(file.uid); |
|
|
|
|
uploadRef.value?.abort(file); |
|
|
|
|
handleError(new Error('PDF保存响应超时'), file); |
|
|
|
|
}, pdfResponseTimeout); |
|
|
|
|
responseTimers.set(file.uid, timer); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
onBeforeUnmount(() => { |
|
|
|
|
responseTimers.forEach((timer) => window.clearTimeout(timer)); |
|
|
|
|
responseTimers.clear(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
watch( |
|
|
|
|
() => props.files, |
|
|
|
|
(newValue) => { |
|
|
|
|
@ -134,11 +163,16 @@ function uploadProgress(progressEvent, file) {
|
|
|
|
|
|
|
|
|
|
const filterFiles = files.value.filter((item) => file.uid === item.uid); |
|
|
|
|
if (filterFiles.length) { |
|
|
|
|
filterFiles[0].percent = Math.min(99, parseInt(progressEvent.percent)); |
|
|
|
|
const percent = parseInt(progressEvent.percent); |
|
|
|
|
filterFiles[0].percent = Math.min(99, percent); |
|
|
|
|
if (percent >= 100) { |
|
|
|
|
startPdfResponseTimer(file); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function handleSuccess(data, file) { |
|
|
|
|
clearResponseTimer(file); |
|
|
|
|
const filterFiles = files.value.filter((item) => file.uid === item.uid); |
|
|
|
|
if (data.code !== 200) { |
|
|
|
|
if (!enableArchiveFallback(file)) { |
|
|
|
|
@ -166,6 +200,7 @@ function handleSuccess(data, file) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function handleError(e, file) { |
|
|
|
|
clearResponseTimer(file); |
|
|
|
|
console.log(e, file); |
|
|
|
|
const fileIndex = files.value.findIndex((item) => file.uid === item.uid); |
|
|
|
|
if (fileIndex > -1) { |
|
|
|
|
|