<template>
<el-upload
v-model:file-list="fileList"
:http-request="uploadFile"
:multiple="true"
:before-upload="beforeUpload"
:auto-upload="false"
list-type="text"
>
<el-button type="primary">上传文件</el-button>
<template #tip>
<div class="el-upload__tip">
jpg/png files with a size less than 500KB.
</div>
</template>
</el-upload>
<el-button type="success" @click="submitUpload">提交</el-button>
</template>
<script setup>
import { ref } from 'vue';
import { ElMessage } from 'element-plus';
import axios from 'axios';
const fileList = ref([]);
const uploadFilesInBatch = async (files) => {
const batchSize = 5;
let successCount = 0;
let failureCount = 0;
for (let i = 0; i < files.length; i += batchSize) {
const batch = files.slice(i, i + batchSize);
const results = await Promise.allSettled(batch.map(file => uploadFile({ file })));
results.forEach(result => {
if (result.status === 'fulfilled') {
successCount++;
} else {
failureCount++;
}
});
}
ElMessage({
message: `上传完成!成功:${successCount},失败:${failureCount}`,
type: failureCount > 0 ? 'warning' : 'success',
duration: 5000,
});
};
const submitUpload = async () => {
if (fileList.value.length === 0) {
ElMessage.warning('没有文件需要上传.');
return;
}
try {
const filesToUpload = fileList.value.filter(file => file.status !== 'success');
await uploadFilesInBatch(filesToUpload);
} catch (error) {
ElMessage.error('文件上传过程中出现错误.');
}
};
const uploadFile = ({ file }) => {
return new Promise(async (resolve, reject) => {
const formData = new FormData();
formData.append('file', file.raw);
try {
const response = await axios.post('/service/designWorkorder/importByZip', formData, {
headers: { 'Content-Type': 'multipart/form-data' },
});
if (response.status === 200) {
file.status = 'success';
resolve();
} else {
file.status = 'fail';
reject(new Error(`文件 ${file.name} 上传失败.`));
}
} catch (error) {
file.status = 'fail';
reject(error);
}
});
};
const beforeUpload = (file) => {
const isJPGOrPNG = file.type === 'image/jpeg' || file.type === 'image/png';
const isLt500KB = file.size / 1024 < 500;
if (!isJPGOrPNG) {
ElMessage.error('仅允许上传 JPG/PNG 文件.');
return false;
}
if (!isLt500KB) {
ElMessage.error('文件大小必须小于 500KB.');
return false;
}
return true;
};
</script>
<style scoped>
.el-upload__tip {
color: #909399;
font-size: 12px;
}
</style>