diff --git a/src/api/infra/file/index.ts b/src/api/infra/file/index.ts index 374f8c6ecc8c6c8863f834eccc4979267c074d80..01009f2f031776b0103a2c0e3bb75618b8cd057a 100644 --- a/src/api/infra/file/index.ts +++ b/src/api/infra/file/index.ts @@ -41,6 +41,6 @@ export const createFile = (data: any) => { } // 上传文件 -export const updateFile = (data: any) => { - return request.upload({ url: '/infra/file/upload', data }) +export const updateFile = (data: any, onUploadProgress?: Function) => { + return request.upload({ url: '/infra/file/upload', data, onUploadProgress }) } diff --git a/src/components/UploadFile/src/useUpload.ts b/src/components/UploadFile/src/useUpload.ts index 2e9a51a670eec26d64cbc9d0180bfbccdb8448cc..8f316eb59b074554827febe55d44b2fe155e516d 100644 --- a/src/components/UploadFile/src/useUpload.ts +++ b/src/components/UploadFile/src/useUpload.ts @@ -1,6 +1,6 @@ import * as FileApi from '@/api/infra/file' -import { UploadRawFile, UploadRequestOptions } from 'element-plus/es/components/upload/src/upload' -import axios from 'axios' +import { UploadRawFile, UploadRequestOptions, UploadProgressEvent } from 'element-plus/es/components/upload/src/upload' +import axios, { AxiosProgressEvent } from 'axios' /** * 获得上传 URL @@ -16,6 +16,13 @@ export const useUpload = (directory?: string) => { const isClientUpload = UPLOAD_TYPE.CLIENT === import.meta.env.VITE_UPLOAD_TYPE // 重写ElUpload上传方法 const httpRequest = async (options: UploadRequestOptions) => { + // 文件上传进度监听 + const uploadProgressHandler = (evt: AxiosProgressEvent) => { + const upEvt: UploadProgressEvent = Object.assign(evt.event) + upEvt.percent = evt.progress ? (evt.progress * 100) : 0 + options.onProgress(upEvt) // 触发 el-upload 的 on-progress + } + // 模式一:前端上传 if (isClientUpload) { // 1.1 生成文件名称 @@ -27,7 +34,8 @@ export const useUpload = (directory?: string) => { .put(presignedInfo.uploadUrl, options.file, { headers: { 'Content-Type': options.file.type - } + }, + onUploadProgress: uploadProgressHandler }) .then(() => { // 1.4. 记录文件信息到后端(异步) @@ -39,7 +47,7 @@ export const useUpload = (directory?: string) => { // 模式二:后端上传 // 重写 el-upload httpRequest 文件上传成功会走成功的钩子,失败走失败的钩子 return new Promise((resolve, reject) => { - FileApi.updateFile({ file: options.file, directory }) + FileApi.updateFile({ file: options.file, directory }, uploadProgressHandler) .then((res) => { if (res.code === 0) { resolve(res) diff --git a/src/views/infra/file/FileForm.vue b/src/views/infra/file/FileForm.vue index 1de1e253fe0b71beb9ca5a28885b4fa6f9e87c70..84b2504adb3708b88925a7b6cb3f3af123c07d13 100644 --- a/src/views/infra/file/FileForm.vue +++ b/src/views/infra/file/FileForm.vue @@ -11,6 +11,7 @@ :on-change="handleFileChange" :on-error="submitFormError" :on-exceed="handleExceed" + :on-progress="handleProgress" :on-success="submitFormSuccess" :http-request="httpRequest" accept=".jpg, .png, .gif" @@ -32,6 +33,7 @@