Skip to content

Commit 5d3e92b

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents cc3750c + ab82906 commit 5d3e92b

File tree

2 files changed

+35
-41
lines changed

2 files changed

+35
-41
lines changed

src/api/file-api.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import request from "@/utils/request";
22

33
const FileAPI = {
4-
/** 上传文件 */
5-
upload(formData: FormData) {
4+
/** 上传文件 (传入 FormData,上传进度回调) */
5+
upload(formData: FormData, onProgress?: (percent: number) => void) {
66
return request<any, FileInfo>({
77
url: "/api/v1/files",
88
method: "post",
99
data: formData,
1010
headers: { "Content-Type": "multipart/form-data" },
11+
onUploadProgress: (progressEvent) => {
12+
if (progressEvent.total) {
13+
const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
14+
onProgress?.(percent);
15+
}
16+
},
1117
});
1218
},
1319

src/components/Upload/FileUpload.vue

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
:style="props.style"
77
:before-upload="handleBeforeUpload"
88
:http-request="handleUpload"
9-
:on-progress="handleProgress"
109
:on-success="handleSuccess"
1110
:on-error="handleError"
1211
:accept="props.accept"
@@ -20,25 +19,24 @@
2019

2120
<!-- 文件列表 -->
2221
<template #file="{ file }">
23-
<div class="el-upload-list__item-info">
24-
<a class="el-upload-list__item-name" @click="handleDownload(file)">
25-
<el-icon><Document /></el-icon>
26-
<span class="el-upload-list__item-file-name">{{ file.name }}</span>
27-
<span class="el-icon--close" @click.stop="handleRemove(file.url!)">
28-
<el-icon><Close /></el-icon>
29-
</span>
30-
</a>
31-
</div>
22+
<template v-if="file.status === 'success'">
23+
<div class="el-upload-list__item-info">
24+
<a class="el-upload-list__item-name" @click="handleDownload(file)">
25+
<el-icon><Document /></el-icon>
26+
<span class="el-upload-list__item-file-name">{{ file.name }}</span>
27+
<span class="el-icon--close" @click.stop="handleRemove(file.url!)">
28+
<el-icon><Close /></el-icon>
29+
</span>
30+
</a>
31+
</div>
32+
</template>
33+
<template v-else>
34+
<div class="el-upload-list__item-info">
35+
<el-progress style="display: inline-flex" :percentage="file.percentage" />
36+
</div>
37+
</template>
3238
</template>
3339
</el-upload>
34-
35-
<el-progress
36-
:style="{
37-
display: showProgress ? 'inline-flex' : 'none',
38-
width: '100%',
39-
}"
40-
:percentage="progressPercent"
41-
/>
4240
</div>
4341
</template>
4442
<script lang="ts" setup>
@@ -47,7 +45,6 @@ import {
4745
UploadUserFile,
4846
UploadFile,
4947
UploadFiles,
50-
UploadProgressEvent,
5148
UploadRequestOptions,
5249
} from "element-plus";
5350
@@ -111,7 +108,6 @@ const props = defineProps({
111108
},
112109
},
113110
});
114-
115111
const modelValue = defineModel("modelValue", {
116112
type: [Array] as PropType<FileInfo[]>,
117113
required: true,
@@ -120,9 +116,6 @@ const modelValue = defineModel("modelValue", {
120116
121117
const fileList = ref([] as UploadFile[]);
122118
123-
const showProgress = ref(false);
124-
const progressPercent = ref(0);
125-
126119
// 监听 modelValue 转换用于显示的 fileList
127120
watch(
128121
modelValue,
@@ -160,34 +153,29 @@ function handleBeforeUpload(file: UploadRawFile) {
160153
function handleUpload(options: UploadRequestOptions) {
161154
return new Promise((resolve, reject) => {
162155
const file = options.file;
163-
164156
const formData = new FormData();
165157
formData.append(props.name, file);
166158
167159
// 处理附加参数
168160
Object.keys(props.data).forEach((key) => {
169161
formData.append(key, props.data[key]);
170162
});
171-
172-
FileAPI.upload(formData)
173-
.then((data) => {
174-
resolve(data);
163+
FileAPI.upload(formData, (percent) => {
164+
const uid = file.uid;
165+
const fileItem = fileList.value.find((file) => file.uid === uid);
166+
if (fileItem) {
167+
fileItem.percentage = percent;
168+
}
169+
})
170+
.then((res) => {
171+
resolve(res);
175172
})
176-
.catch((error) => {
177-
reject(error);
173+
.catch((err) => {
174+
reject(err);
178175
});
179176
});
180177
}
181178
182-
/**
183-
* 上传进度
184-
*
185-
* @param event
186-
*/
187-
const handleProgress = (event: UploadProgressEvent) => {
188-
progressPercent.value = event.percent;
189-
};
190-
191179
/**
192180
* 上传成功
193181
*/

0 commit comments

Comments
 (0)