refactor: ♻️ 重构了文件上传,解决文件上传不显示进度条的问题
重构了文件上传,解决文件上传不显示进度条的问题,现在多选文件上传时,每个文件有单独的进度条
This commit is contained in:
@@ -1,13 +1,19 @@
|
|||||||
import request from "@/utils/request";
|
import request from "@/utils/request";
|
||||||
|
|
||||||
const FileAPI = {
|
const FileAPI = {
|
||||||
/** 上传文件 */
|
/** 上传文件 (传入 FormData,上传进度回调) */
|
||||||
upload(formData: FormData) {
|
upload(formData: FormData, onProgress?: (percent: number) => void) {
|
||||||
return request<any, FileInfo>({
|
return request<any, FileInfo>({
|
||||||
url: "/api/v1/files",
|
url: "/api/v1/files",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: formData,
|
data: formData,
|
||||||
headers: { "Content-Type": "multipart/form-data" },
|
headers: { "Content-Type": "multipart/form-data" },
|
||||||
|
onUploadProgress: (progressEvent) => {
|
||||||
|
if (progressEvent.total) {
|
||||||
|
const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
|
||||||
|
onProgress?.(percent);
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
:style="props.style"
|
:style="props.style"
|
||||||
:before-upload="handleBeforeUpload"
|
:before-upload="handleBeforeUpload"
|
||||||
:http-request="handleUpload"
|
:http-request="handleUpload"
|
||||||
:on-progress="handleProgress"
|
|
||||||
:on-success="handleSuccess"
|
:on-success="handleSuccess"
|
||||||
:on-error="handleError"
|
:on-error="handleError"
|
||||||
:accept="props.accept"
|
:accept="props.accept"
|
||||||
@@ -20,25 +19,24 @@
|
|||||||
|
|
||||||
<!-- 文件列表 -->
|
<!-- 文件列表 -->
|
||||||
<template #file="{ file }">
|
<template #file="{ file }">
|
||||||
<div class="el-upload-list__item-info">
|
<template v-if="file.status === 'success'">
|
||||||
<a class="el-upload-list__item-name" @click="handleDownload(file)">
|
<div class="el-upload-list__item-info">
|
||||||
<el-icon><Document /></el-icon>
|
<a class="el-upload-list__item-name" @click="handleDownload(file)">
|
||||||
<span class="el-upload-list__item-file-name">{{ file.name }}</span>
|
<el-icon><Document /></el-icon>
|
||||||
<span class="el-icon--close" @click.stop="handleRemove(file.url!)">
|
<span class="el-upload-list__item-file-name">{{ file.name }}</span>
|
||||||
<el-icon><Close /></el-icon>
|
<span class="el-icon--close" @click.stop="handleRemove(file.url!)">
|
||||||
</span>
|
<el-icon><Close /></el-icon>
|
||||||
</a>
|
</span>
|
||||||
</div>
|
</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="el-upload-list__item-info">
|
||||||
|
<el-progress style="display: inline-flex" :percentage="file.percentage" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
|
|
||||||
<el-progress
|
|
||||||
:style="{
|
|
||||||
display: showProgress ? 'inline-flex' : 'none',
|
|
||||||
width: '100%',
|
|
||||||
}"
|
|
||||||
:percentage="progressPercent"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
@@ -47,7 +45,6 @@ import {
|
|||||||
UploadUserFile,
|
UploadUserFile,
|
||||||
UploadFile,
|
UploadFile,
|
||||||
UploadFiles,
|
UploadFiles,
|
||||||
UploadProgressEvent,
|
|
||||||
UploadRequestOptions,
|
UploadRequestOptions,
|
||||||
} from "element-plus";
|
} from "element-plus";
|
||||||
|
|
||||||
@@ -111,7 +108,6 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const modelValue = defineModel("modelValue", {
|
const modelValue = defineModel("modelValue", {
|
||||||
type: [Array] as PropType<FileInfo[]>,
|
type: [Array] as PropType<FileInfo[]>,
|
||||||
required: true,
|
required: true,
|
||||||
@@ -120,9 +116,6 @@ const modelValue = defineModel("modelValue", {
|
|||||||
|
|
||||||
const fileList = ref([] as UploadFile[]);
|
const fileList = ref([] as UploadFile[]);
|
||||||
|
|
||||||
const showProgress = ref(false);
|
|
||||||
const progressPercent = ref(0);
|
|
||||||
|
|
||||||
// 监听 modelValue 转换用于显示的 fileList
|
// 监听 modelValue 转换用于显示的 fileList
|
||||||
watch(
|
watch(
|
||||||
modelValue,
|
modelValue,
|
||||||
@@ -160,7 +153,6 @@ function handleBeforeUpload(file: UploadRawFile) {
|
|||||||
function handleUpload(options: UploadRequestOptions) {
|
function handleUpload(options: UploadRequestOptions) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const file = options.file;
|
const file = options.file;
|
||||||
|
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append(props.name, file);
|
formData.append(props.name, file);
|
||||||
|
|
||||||
@@ -168,26 +160,22 @@ function handleUpload(options: UploadRequestOptions) {
|
|||||||
Object.keys(props.data).forEach((key) => {
|
Object.keys(props.data).forEach((key) => {
|
||||||
formData.append(key, props.data[key]);
|
formData.append(key, props.data[key]);
|
||||||
});
|
});
|
||||||
|
FileAPI.upload(formData, (percent) => {
|
||||||
FileAPI.upload(formData)
|
const uid = file.uid;
|
||||||
.then((data) => {
|
const fileItem = fileList.value.find((file) => file.uid === uid);
|
||||||
resolve(data);
|
if (fileItem) {
|
||||||
|
fileItem.percentage = percent;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
resolve(res);
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((err) => {
|
||||||
reject(error);
|
reject(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 上传进度
|
|
||||||
*
|
|
||||||
* @param event
|
|
||||||
*/
|
|
||||||
const handleProgress = (event: UploadProgressEvent) => {
|
|
||||||
progressPercent.value = event.percent;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 上传成功
|
* 上传成功
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user