Element|Upload结合Progress实现上传展示进度条

背景 :

    项目里的 附件上传 题型组件,用户在上传过程中,如果文件较大,上传过程较慢,而又没有一个类似 Loading... 的加载过程的话,会显得干愣愣的,用户体验较差,所以需要添加一个进度条来提示用户上传的进度,下面有两种方式,一种假的,一种真的,伙伴们可根据需求自行选取实现。

    本文章向大家介绍使用 Upload + Progress 实现文件上传进度条实时更新功能,主要包括使用 Upload + Progress 实现文件上传进度条实时更新功能使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Upload 上传

通过点击或者拖拽上传文件

Progress 进度条

用于展示操作进度,告知用户当前状态和预期。


“ 简单 && 假 ” 的 进度条 :

利用 setInterval 定时器 模拟实现

<template><div><el-uploadref="uploadRef"action="#":file-list="fileList":on-change="onChangeData":http-request="handleRequest":before-upload="beforeUpload"><el-button v-show="isShowButton" class="btn upload-btn">上传附件</el-button><div slot="tip" class="el-upload__tip">上传文件大小不超过50M</div></el-upload><el-progressv-show="showProgress":stroke-width="6":percentage="progressPercent"></el-progress></div>
</template><script>
import { uploadFileApi } from '@/api';export default {name: 'uploadFile',data() {return {fileType: '', // 文件类型fileList: [], // 上传的文件列表progressPercent: 0, // 进度条百分比isShowButton: false, // 是否显示上传按钮showProgress: false, // 是否展示进度条isAllowFileTypes: false, // 是否为支持的上传类型allowFileTypes: [], // 存储不支持的文件类型};},methods: {// 上传的执行方法onChangeData(file, fileList) {// 前四行代码为了解决:on-change方法第二次调用不起来的问题let uploadFilesArr = this.$refs.uploadRef.uploadFiles;if (uploadFilesArr.length !== 0) {this.$refs.uploadRef.uploadFiles = [];}let arr = file.name.split('.');this.fileType = '.' + arr[arr.length - 1].toLowerCase();this.isAllowFileTypes = this.allowFileTypes.includes(this.fileType);if (this.isAllowFileTypes) {this.isShowButton = false;this.fileList = [file];if (file.status === 'ready') {this.progressPercent = 0;this.showProgress = true; // 展示进度条const interval = setInterval(() => {if (this.progressPercent >= 99) {clearInterval();return;}this.progressPercent += 1;}, 50);}if (file.status === 'success') {this.progressPercent = 100;this.showProgress = false; // 隐藏进度条}}},// 文件上传async handleRequest(data) {let formdata = new FormData();formdata.append('file', data.file);let res = await uploadFileApi(formdata);let { code } = res;if (code === '0') {// 上传成功// ...} else if (code === '1') {// 上传失败this.isShowButton = true;this.fileList = [];}},// 上传文件之前的钩子,对文件大小进行校验beforeUpload(file) {const isLt2M = file.size / 1024 / 1024 < 50;if (!isLt2M) {this.$message.error('上传文件大小大小不能超过 50MB!');return isLt2M;}},},
};
</script>

真实加载的进度条 :

1、使用 Upload + Progress 实现文件上传进度条实时更新功能,需要借助 http-request 属性

具体使用方法如下:

  // 上传的执行方法  onChangeData (file, fileList) {// 数据小于0.1M的时候按KB显示const size = file.size/1024/1024 > 0.1 ? `(${(file.size/1024/1024).toFixed(1)}M)` : `(${(file.size/1024).toFixed(1)}KB)`file.name.indexOf('M')>-1 || file.name.indexOf('KB')>-1 ? file.name : file.name += size},// 文件上传handleRequest (data) {let formdata = new FormData()formdata.append('file', data.file)const config = {onUploadProgress: progressEvent => {// progressEvent.loaded:已上传文件大小// progressEvent.total:被上传文件的总大小this.progressPercent = Number((progressEvent.loaded / progressEvent.total * 100).toFixed(2))}}this.$axios.post(this.actionURL,formdata,config).then(res => {if (res.data.code===1) {}})},

2、真实进度条,根据文件上传过程中 文件 切片 实现的

<template><div class="uploadBtn"><el-uploadref="uploadRefs"class="upload-demo"action=""accept="mp4":limit="1":file-list="fileListA":http-request="UploadFileA":on-change="handleChange":on-success="handleSuccess"><el-button size="small" type="primary">点击上传</el-button></el-upload><el-progress v-if="uploading" :percentage="uploadPercentage"></el-progress></div>
</template><script>
export default {name: 'Upload',data() {return {fileListA: [], // 上传的文件列表uploading: false, // 是否正在上传uploadPercentage: 0, // 进度条百分比};},methods: {//上传图片到阿里云UploadFileA(file) {console.time('executionTime'); //测试文件上传所耗时间开始const baseUrl = 'https://你的阿里云地址aliyunUrl.com';const fileName = file.file.uid + file.file.name; //文件信息const url = baseUrl + '/resource/你的阿里云文件夹地址/' + fileName; //拼接地址const xhr = new XMLHttpRequest();xhr.upload.addEventListener('progress', (event) => {if (event.lengthComputable) {const percentage = Math.round((event.loaded * 100) / event.total);this.uploadPercentage = percentage; // 给进度条赋值}});xhr.onreadystatechange = () => {if (xhr.readyState === XMLHttpRequest.DONE) {if (xhr.status === 200 || xhr.status === 201) {console.log('阿里云文件', xhr);this.formData.fileUrl = xhr.responseURL;this.uploadPercentage = 100; // 上传完成后显示100%进度console.timeEnd('executionTime'); //测试文件上传所耗时间结束,打印时间为所耗时间,为毫秒级} else {console.error('上传失败');}this.uploading = false; // 设置上传状态为 false,隐藏进度条}};this.uploading = true; // 设置上传状态为 true,显示进度条this.uploadPercentage = 0; // 设置进度条初始值为0%xhr.open('PUT', url, true);xhr.send(file.file);},},
};
</script>

相关参数解答:

    xhr.onreadystatechange 是 XMLHttpRequest 对象的一个事件处理程序,

它在请求状态发生变化时触发。XMLHttpRequest 对象用于与服务器进行异步通信,onreadystatechange 事件在接收到服务器响应并且请求状态发生变化时被触发。
    具体来说,xhr.onreadystatechange 事件在以下几种情况下被触发:
        xhr.readyState 的值发生变化时
        xhr.status 的值发生变化时
        xhr.statusText 的值发生变化时
        xhr.response 的值发生变化时
    xhr.readyState 是 XMLHttpRequest 对象的属性,表示请求的状态。

    它有如下几个可能的值:
        0:未初始化。XMLHttpRequest 对象已创建或已被 abort() 方法重置。
        1:打开。open() 方法已被调用,但 send() 方法未被调用。
        2:发送。send() 方法已被调用,并且头部和状态已经可获得。
        3:接收。正在接收服务器的响应数据。
        4:完成。已经接收到全部响应数据,并且可以在客户端使用了。


    在 xhr.onreadystatechange 事件处理程序中,我们通常使用条件判断来确定请求的状态是否满足特定条件,以执行相应的操作。例如,在上面的代码中,我们检查 xhr.readyState 是否等于 XMLHttpRequest.DONE,来确定请求是否已完成

  如果是,则进一步检查 xhr.status 是否为 200 或 201,来确定请求是否成功。
通过使用 xhr.onreadystatechange 事件处理程序,我们可以根据不同的请求状态来执行相应的逻辑,例如更新页面内容、处理错误等。

    xhr.upload 是 XMLHttpRequest 对象的一个属性,而不是事件处理程序。
    xhr.upload 属性是用于处理上传过程中的事件的。

  它是一个包含了与上传相关事件的 XMLHttpRequestUpload 对象。
        在前面提到的代码中,我们使用了 xhr.upload.addEventListener 方法来注册一个 progress 事件监听器。这个事件监听器用于追踪上传的进度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/340608.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day4Qt

1.头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTimerEvent>//定时器类 #include <QTextToSpeech> namespace Ui { class Widget; }class Widget : publi…

OpenCV C++ 图像处理实战 ——《多尺度自适应Gamma矫正的低照图像增强》

OpenCV C++ 图像处理实战 ——《多尺度自适应Gamma矫正的低照图像增强》 一、结果演示二、多尺度自适应Gamma矫正的低照度图像增强2.1HSI颜色空间2.1.1 功能源码2.2 自适应于直方图分布的 Gamma 矫正2.2.1 功能源码2.3 多尺度 Retinex 分解与明度增强2.3.1 功能源码三、源码测试…

性能测试之Mysql数据库调优

一、前言 性能调优前提&#xff1a;无监控不调优&#xff0c;对于mysql性能的监控前几天有文章提到过&#xff0c;有兴趣的朋友可以去看一下 二、Mysql性能指标及问题分析和定位 1、我们在监控图表中关注的性能指标大概有这么几个&#xff1a;CPU、内存、连接数、io读写时间、…

x-cmd pkg | grex - 用于生成正则表达的命令行工具

目录 简介首次用户生成的正则表达式与 perl 和 rust 兼容支持 Unicode 符号友好的用户体验进一步阅读 简介 grex 是一个旨在简化创作正则表达式的复杂且繁琐任务的库和命令行程序。这个项目最初是 Devon Govett 编写的 JavaScript 工具 regexgen 的 Rust 移植。但 regexgen 在…

鸿蒙开发已解决-arkts编译报错-arkts-limited-stdlib错误

文章目录 项目场景:问题描述原因分析:解决方案:适配指导案例此Bug解决方案总结项目场景: arkts编译报错-arkts-limited-stdlib错误。 我用Deveco studio4.0 beta2开发应用,报arkts-limited-stdlib错误 报错内容为: ERROR: ArKTS:ERROR File: D:/prRevivw/3792lapplica…

SPI接口协议

SPI接口协议 SPI(Serial Peripheral Interface)是由Motorola公司定义的接口协议标准&#xff0c;串行外设接口(SPI)是微控制器和外围IC&#xff08;如传感器、 ADC、 DAC、移位寄存器、 SRAM等&#xff09;之间使用最广泛的接口之一。SPI是一种同步、全双工、主从式接口&#x…

通过两台linux主机配置ssh实现互相免密登陆

一、准备工作 1:两台Linux主机&#xff0c;需要能ping通 2:检查防火墙是否处于关闭状态,没关闭的话关闭&#xff0c;防止防火墙拦截流量 查看防火墙状态&#xff1a;systemctl status firewalld 关闭防火墙&#xff1a;systemctl stop firewalld 3:使用getenforce命令查…

ssm+vue的城投公司企业人事管理系统设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的城投公司企业人事管理系统设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#x…

邻接矩阵、可达性矩阵、完全关联矩阵、可达性矩阵的计算

邻接矩阵&#xff1a;很简单&#xff0c;就是两个点有关系就是1&#xff0c;没有关系就是0 可达性矩阵&#xff1a;非常简单&#xff0c;两点之间有路为1&#xff0c;没有路为0 可发行矩阵的计算&#xff1a;有n个元素&#xff0c;初始可达性矩阵为A&#xff0c;那么最终的矩阵…

springboot框架开发的中小学智慧校园云平台源码

一、智慧校园技术框架 1、使用springboot框架Javavue2 B/S架构 2、JAVA语言数据库MySQL5.7 3、移动端小程序使用小程序原生语言开发 4、电子班牌固件安卓7.1&#xff1b;使用Java Android原生 5、elmentui &#xff0c;Quartz&#xff0c;jpa&#xff0c;jwt 6、前后端分离架…

MES数据采集在制造业的应用

MES设备数据采集的流程包括以下几个步骤&#xff1a; 1. 设备接入&#xff1a;将设备接入MES系统&#xff0c;建立设备与MES系统之间的连接。 2. 数据采集&#xff1a;通过传感器和采集器等设备&#xff0c;采集设备运行数据和状态信息。 3. 数据存储&#xff1a;将采集到的设…

rime中州韵小狼毫 词组注释 滤镜

在rime中州韵小狼毫 联想词组 滤镜一文中&#xff0c;我们通过Filter滤镜功能配置了联想词组的功能&#xff0c;这使得我们在输入一些关键词汇时&#xff0c;可以联想补充一些附加的词组&#xff0c;例如我输入“手机”&#xff0c;就可以联想补充对应的手机号&#xff0c;如下…