vue3+ts el-upload多文件上传时 展示上传进度条

单文件上传
api代码

export const uploadFileHandle2 = (params: any,  url: string, onProgress:any) => {
	const formData = new window.FormData();
	params.forEach((file: any) => formData.append('files', file.raw));
    // 如果有自定义参数
    if (params.data) {
        Object.keys(params.data).forEach((key) => {
            const value = params.data[key];
            if (Array.isArray(value)) {
                value.forEach(item => {
                    formData.append(`${key}[]`, item);
                });
            } else {
                formData.append(key, value);
            }
        });
    }
    return request({
        url: url,//接口路径
        method: 'POST',
        data: formData,
        headers: {
            'Content-Type': 'multipart/form-data',
            ignoreCancelToken: true,
        },
		onUploadProgress: progressEvent => {
            const total = progressEvent.total as any;
            const current = progressEvent.loaded;
            const percentage = Math.round((current / total) * 100);
            if (onProgress) {
                onProgress(percentage); // 调用回调函数传递进度
            }
        },
    });
};

vue代码

<el-upload :before-upload="beforeUpload" v-model:file-list="fileList" :multiple="true" :show-file-list="false" :http-request="uploadUrlHandle">
	<el-button type="primary">上传文件</el-button>
</el-upload>
 <!-- 进度条弹窗 -->
		<el-dialog :modal="false"  v-model="showProgressBar" title="上传进度" width="30%" style="border-radius: 10px;position: fixed; bottom: 20px;right: 20px;" >
			<div v-if="uploadProgress !== null">
				<el-progress :percentage="uploadProgress"></el-progress>
			</div>
			<div v-else>
				<el-progress :percentage="0"></el-progress>
				上传失败
			</div>
		</el-dialog>

// 上传前的钩子
const beforeUpload = (file: File) => {
	fileList.value = [];
	// 控制只上传一次
	if (!hasUploaded.value) {
		hasUploaded.value = true;
		return true; // 允许上传
	}
	return false; // 阻止上传
};
const uploadProgress = ref(null);
const fileList = ref([]);
const hasUploaded = ref(false);
const onProgress = (progress: any) => {
	uploadProgress.value = progress; // 更新进度
};
const showProgressBar = ref(false);
const uploadUrlHandle = async (options: UploadRequestOptions, data: any) => {
	uploadProgress.value = null; // 重置进度
	const params = fileList.value.filter((item: any) => {
		return item.status === 'ready';
	});
	showProgressBar.value = true; // 显示进度条弹窗
	uploadPics(params, onProgress)
		.then(async (res) => {
			debugger;
			if (res.data.code == 200) {
				hasUploaded.value = false;
				res.data.result.forEach((item: any, indexA: any) => {});
			} else {
				hasUploaded.value = false;
			}
		})
		.catch((error) => {
			console.error('Upload failed:', error);
			hasUploaded.value = false;
			uploadProgress.value = null; // 重置进度
			fileList.value = [];
		});
};

多文件上传

### Vue3 中使用 Element Plus 的 `el-upload` 组件显示文件上传进度 为了在 Vue3 项目中利用 Element Plus 库中的 `el-upload` 组件展示文件上传过程中的进度条,可以遵循如下方法构建相应的逻辑[^1]。 #### 安装依赖库 首先确认已经安装了必要的包: ```bash npm install element-plus axios ``` #### 创建上传组件模板结构 定义 HTML 结构部分,在页面上放置用于触发文件选择对话框以及呈现上传状态的 UI 控件。 ```html <template> <div class="upload-demo"> <!-- 使用 :on-progress 属性绑定处理函数 --> <el-upload ref="upload" action="/api/upload" multiple :limit="3" :auto-upload="false" :on-change="handleChange" :before-upload="handleBeforeUpload" :http-request="customUpload" :on-error="handleError" :on-success="handleSuccess" :on-exceed="handleExceed" :file-list="fileList" :disabled="isUploading || fileList.length >= limitCount" > <button type="button">点击上传</button> <span slot="tip" v-if="!isUploading && fileList.length < limitCount">最多可选 {{limitCount}} 个文件</span> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload" :disabled="isUploading || fileList.length === 0">开始上传</el-button> </el-upload> <el-progress v-show="showProgress" :percentage="progressPercentage"></el-progress> </div> </template> ``` #### 编写 JavaScript 部分代码 接下来编写脚本逻辑来控制整个流程并更新视图上的进度指示器。 ```javascript <script setup lang="ts"> import { ref, computed } from &#39;vue&#39;; import axios from &#39;axios&#39;; const upload = ref(null); let isUploading = ref(false); // 正在上传标记 let progressPercentage = ref(0); // 当前进度百分比 let showProgress = ref(false); // 是否显示进度条 let fileList = ref([] as any[]); const limitCount = 3; // 文件数量上限 function handleChange(file: any, fileList: any[]) { console.log(&#39;change&#39;, file, fileList); } async function customUpload(option: any) { const formData = new FormData(); formData.append(&#39;file&#39;, option.file); try { isUploading.value = true; showProgress.value = true; await axios({ url: &#39;/your-server-endpoint&#39;, method: &#39;POST&#39;, data: formData, onUploadProgress: (progressEvent) => { let complete = ((progressEvent.loaded / progressEvent.total) * 100) | 0; progressPercentage.value = Math.min(complete, 100); }, }); handleSuccess(&#39;&#39;, option.file); } catch (error) { handleError(error, option.file); } finally { setTimeout(() => { isUploading.value = false; showProgress.value = false; }, 1500); } } ... </script> ``` 上述示例展示了如何通过监听 `onUploadProgress` 回调获取到实际传输的数据量变化情况,并据此调整前端界面上所见的进度比例[^2]。此外还包含了对于并发限制、错误提示等功能的支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值