feat: 文件上传 进度条

This commit is contained in:
dap 2025-01-12 11:43:23 +08:00
parent 93673fd095
commit 2378728d7f
2 changed files with 34 additions and 4 deletions

View File

@ -1,12 +1,27 @@
import type { AxiosRequestConfig } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
/**
* Axios上传进度事件
*/
export type AxiosProgressEvent = AxiosRequestConfig['onUploadProgress'];
/** /**
* *
* @param file * @param file
* @param onUploadProgress
* @returns * @returns
*/ */
export function uploadApi(file: Blob | File) { export function uploadApi(
return requestClient.upload('/resource/oss/upload', { file }); file: Blob | File,
onUploadProgress?: AxiosProgressEvent,
) {
return requestClient.upload(
'/resource/oss/upload',
{ file },
{ onUploadProgress, timeout: 60_000 },
);
} }
/** /**
* *

View File

@ -2,6 +2,10 @@
import type { UploadFile, UploadProps } from 'ant-design-vue'; import type { UploadFile, UploadProps } from 'ant-design-vue';
import type { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface'; import type { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import type { AxiosResponse } from '@vben/request';
import type { AxiosProgressEvent } from '#/api';
import { ref, toRefs, watch } from 'vue'; import { ref, toRefs, watch } from 'vue';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
@ -26,7 +30,10 @@ const props = withDefaults(
* 需自行改造 ./helper/checkFileType方法 * 需自行改造 ./helper/checkFileType方法
*/ */
accept?: string[]; accept?: string[];
api?: (...args: any[]) => Promise<any>; api?: (
file: Blob | File,
onUploadProgress?: AxiosProgressEvent,
) => Promise<AxiosResponse<any>>;
disabled?: boolean; disabled?: boolean;
helpText?: string; helpText?: string;
// Infinity // Infinity
@ -144,12 +151,19 @@ async function customRequest(info: UploadRequestOption<any>) {
return; return;
} }
try { try {
const res = await api?.(info.file); //
const progressEvent: AxiosProgressEvent = (e) => {
const percent = Math.trunc((e.loaded / e.total!) * 100);
info.onProgress!({ percent });
};
const res = await api?.(info.file as File, progressEvent);
/** /**
* 由getValue处理 传对象过去 * 由getValue处理 传对象过去
* 直接传string(id)会被转为Number * 直接传string(id)会被转为Number
* 内部的逻辑由requestClient.upload处理 这里不用判断业务状态码 不符合会自动reject
*/ */
info.onSuccess!(res); info.onSuccess!(res);
message.success($t('component.upload.uploadSuccess'));
// //
const value = getValue(); const value = getValue();
isInnerOperate.value = true; isInnerOperate.value = true;
@ -191,6 +205,7 @@ function getValue() {
:max-count="maxNumber" :max-count="maxNumber"
:multiple="multiple" :multiple="multiple"
list-type="text" list-type="text"
:progress="{ showInfo: true }"
@remove="handleRemove" @remove="handleRemove"
> >
<div v-if="fileList && fileList.length < maxNumber"> <div v-if="fileList && fileList.length < maxNumber">