Browse Source

feat: pdf失败的时候允许压缩包上传

main
buaixuexideshitongxue 1 month ago
parent
commit
854448fa5c
  1. 37
      src/components/file/upload.vue

37
src/components/file/upload.vue

@ -1,6 +1,7 @@
<template> <template>
<div> <div>
<el-upload <el-upload
ref="uploadRef"
:action="`${BASE_PATH}/file/upload`" :action="`${BASE_PATH}/file/upload`"
:headers="{ Authorization: getToken() }" :headers="{ Authorization: getToken() }"
multiple multiple
@ -55,10 +56,13 @@ const props = defineProps({
const emit = defineEmits(["update:files"]); const emit = defineEmits(["update:files"]);
const uploadRef = ref();
const files = ref(props.files); const files = ref(props.files);
const allowArchiveFallback = ref(false); const allowArchiveFallback = ref(false);
const fallbackArchiveExts = ['zip', 'rar', '7z']; const fallbackArchiveExts = ['zip', 'rar', '7z'];
const archiveExts = [...fallbackArchiveExts, 'tar', 'gz', 'bz2', 'xz', 'iso', 'dmg']; const archiveExts = [...fallbackArchiveExts, 'tar', 'gz', 'bz2', 'xz', 'iso', 'dmg'];
const pdfResponseTimeout = 15000;
const responseTimers = new Map();
function getFileExt(file) { function getFileExt(file) {
const name = (file?.name || file?.raw?.name || '').toLowerCase(); const name = (file?.name || file?.raw?.name || '').toLowerCase();
@ -74,6 +78,31 @@ function enableArchiveFallback(file) {
return true; 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( watch(
() => props.files, () => props.files,
(newValue) => { (newValue) => {
@ -134,11 +163,16 @@ function uploadProgress(progressEvent, file) {
const filterFiles = files.value.filter((item) => file.uid === item.uid); const filterFiles = files.value.filter((item) => file.uid === item.uid);
if (filterFiles.length) { 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) { function handleSuccess(data, file) {
clearResponseTimer(file);
const filterFiles = files.value.filter((item) => file.uid === item.uid); const filterFiles = files.value.filter((item) => file.uid === item.uid);
if (data.code !== 200) { if (data.code !== 200) {
if (!enableArchiveFallback(file)) { if (!enableArchiveFallback(file)) {
@ -166,6 +200,7 @@ function handleSuccess(data, file) {
} }
function handleError(e, file) { function handleError(e, file) {
clearResponseTimer(file);
console.log(e, file); console.log(e, file);
const fileIndex = files.value.findIndex((item) => file.uid === item.uid); const fileIndex = files.value.findIndex((item) => file.uid === item.uid);
if (fileIndex > -1) { if (fileIndex > -1) {

Loading…
Cancel
Save