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

news2025/1/11 10:07:10

背景 :

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

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

Upload 上传

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

Progress 进度条

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


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

利用 setInterval 定时器 模拟实现

<template>
  <div>
    <el-upload
      ref="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-progress
      v-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-upload
      ref="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.coloradmin.cn/o/1375047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot+vue的毕业论文管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的毕业论文管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的毕业论文管理系统&#xff0c;采用M&#xff08;model&…

JWT---JSON Web Token

JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 JSON Web Token的结构是什么样的 JSON…

Handsfree_ros_imu:ROS机器人IMU模块ARHS姿态传感器(A9)Liunx系统Ubuntu20.04学习启动和运行教程

这个是篇学习 Handsfree_ros_imu 传感器的博客记录 官方教程链接见&#xff1a; https://docs.taobotics.com/docs/hfi-imu/ 产品功能 IMU 内有 加速度计&#xff0c;陀螺仪&#xff0c;磁力计这些传感器&#xff0c;通过固定 imu 到物体上后&#xff0c;可以获取物体在运动…

登录模块的实现

一.前期的准备工作 1.页面的布局 (1)表单的校验: 利用element-ui提供的文档绑定rules规则后实现校验 (2)跨域的配置 &#xff1a; 利用proxy代理来解决跨域的问题 (3)axios拦截器的配置 两个点:1. 在请求拦截的成功回调中,如果token,因为调用其它的接口需要token才能调取。 在请…

锤科HandShaker修改版,支持安卓14、澎湃OS

如今几乎各家手机厂商都在布局生态&#xff0c;但PC端往往是最容易被忽略的一环&#xff0c;哪怕是很强的华为鸿蒙、小米澎湃&#xff0c;想要做到手机和电脑互联&#xff0c;也限制了笔记本机型 虽然我一直致力于解锁非小米电脑安装小米电脑管家&#xff0c;比如前几天刚刚更…

在WindowsServer2012中部署war项目

目录 前言 一.jdk安装 二.Tomact安装 三.MySQL安装 ​编辑​编辑​编辑​编辑​编辑​编辑​编辑 四.开放端口号 MySQL开放端口号 Tomact开放端口号 ​编辑 五.项目部署 1.将war放置在tomact中 2.配置项目sql脚本 3.最终效果 前言 安装Java开发工具包&#xff08…

【设计模式-02】Strategy策略模式及应用场景

一、参考资料 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

构建免费的Dokan和WooCommerce构建线上课程市场在线销售数字课程

我们知道创建良好的学习说明和材料很困难。但当涉及到销售时&#xff0c;就变得更加困难。如果您无法出售您的课程&#xff0c;那么没有什么比这更令人沮丧的了。 幸运的是&#xff0c;如果您使用的是 WordPress 网站&#xff0c;那么您可以非常轻松且免费地完成此操作。借助L…

java SSM物业管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM物业管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和 数据库&#xff0c;系统主要采用B/…

2024.1.11 Kafka 消息队列,shell命令,核心原理

目录 一 . 消息队列 二. Kafka 三 . 启动命令 四 . Kafka的Shell 命令 五 . Kafka的核心原理 1. Topic的分区和副本机制 2 . 消息存储机制 和 查询机制 3. Kafka中生产者数据分发策略 六 . Kafka 之所以具有高速的读写性能&#xff0c;主要有以下几个原因 七. 笔记…

指导AI进行推理:提示工程如何弥补RAG系统中的差距

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research) 原文标题:Instructing AI to Reason: How Prompt Engineering Bridges the Gap in RAG Systems 原文地址:https://medium.c…

vscode配置Todo Tree插件

一、在VSCode中安装插件Todo Tree ​​​​ 二、按下快捷键ctrlshiftP&#xff0c;输入setting.jspn 选择相应的配置范围&#xff0c;我们选择的是用户配置 Open User Settings(JSON)&#xff0c;将以下代码插入其中。 //todo-tree 标签配置从这里开始 标签兼容大小写字母(很…

MoE模型性能还能更上一层楼?一次QLoRA微调实践

Fine-Tuning Mixtral 8x7B with QLoRA&#xff1a;Enhancing Model Performance &#x1f680; 编者按&#xff1a;最近&#xff0c;混合专家(Mixture of Experts,MoE)这种模型设计策略展现出了卓越的语言理解能力&#xff0c;如何在此基础上进一步提升 MoE 模型的性能成为业界…

React 18中新钩子 useDeferredValue 使用

React是一个流行的用于构建用户界面的JavaScript库,它不断发展以为开发人员提供优化性能的工具。 React 18中引入的此类工具之一是useDeferredValue钩子,它旨在通过优先渲染更新来提高应用程序的性能。 useDeferredValue钩子是什么? useDeferredValue钩子是React性能优化工…

c++析构函数

析构函数的简述 1. 析构函数和构造函数类似&#xff0c;是c规定当对象的生命周期结束时&#xff0c;默认你会调用析构函数。 2. 同理&#xff0c;当我们不写析构函数的时候&#xff0c;编译器会自动生成一个空实现的析构函数。 3. 析构函数只能编译器自己调用&#xff0c;我们…

CSS3中transform2D变形详解

CSS3变形 在CSS3中&#xff0c;动画效果包括3个部分&#xff1a; 变形(transform)过渡(transition)动画(animation) 在实际开发中&#xff0c;有时需要实现元素的各种变形效果&#xff0c;如平移&#xff0c;缩放&#xff0c;旋转&#xff0c;倾斜等。 在CSS3中&#xff0c…

2 快速前端开发

CSS快速入门 1.CSS案例1.1 内容回顾1.2 案例&#xff1a;二级菜单1.2.1 划分区域1.2.2 搭建骨架1.2.3 Logo区域1.2.4 菜单部分 1.3 案例&#xff1a;顶部菜单 二级菜单小结 1.4 案例&#xff1a;推荐区域1.4.1 划分区域1.4.2 搭建骨架1.4.3 案例的实现小结 2. CSS知识点2.1 ho…

Spark on Hive及 Spark SQL的运行机制

Spark on Hive 集成原理 HiveServer2的主要作用: 接收SQL语句&#xff0c;进行语法检查&#xff1b;解析SQL语句&#xff1b;优化&#xff1b;将SQL转变成MapReduce程序&#xff0c;提交到Yarn集群上运行SparkSQL与Hive集成&#xff0c;实际上是替换掉HiveServer2。是SparkSQL…

基于自适应遗传算法的车间调度matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 编码与初始化 4.2 适应度函数 4.3 遗传操作 4.4 自适应机制 4.5 终止条件 5.完整程序 1.程序功能描述 基于自适应遗传算法的车间调度matlab仿真,可以任意调整工件数和机器数,输出甘…

java基础之异常练习题

异常 1.Java 中所有的错误/异常都继承自 Throwable类&#xff1b;在该类的子类中&#xff0c; Error 类表示严重的底层错误&#xff0c; 对于这类错误一般处理的方式是 直接报告并终止程序 &#xff1b; Exception 类表示异常。 2.查阅API&#xff0c;完成以下填空&#xff1a;…