如何用vue展示上传文件进度和用时

如何用vue展示上传文件进度和用时

一.代码实现

我们可以用onUploadProgress来实现。

1.1.template

<template>
  <div>
    <fieldset>
      <legend>文件上传</legend>
      <!-- 姓名 -->
      <el-form enctype="multipart/form-data">
        <el-form-item>
          <input type="file" @change="handleFileUpload" />
          <el-button type="submit" @click.prevent="uploadFile">上传</el-button>
        </el-form-item>
        <el-form-item label="上传进度" v-if="progressLoad">
          <el-progress :percentage="percentage"></el-progress>
        </el-form-item>
        <el-form-item label="预计用时" v-if="progressLoad"
          >{{ this.leftTime }}
        </el-form-item>
        <el-form-item label="上传速度" v-if="progressLoad">
          {{ this.speed }}</el-form-item
        >
      </el-form>
    </fieldset>
  </div>
</template>

1.2.script

<script>
export default {
  data() {
    return {
      file: null,
      percentage: 0,
      progressLoad: false,
      speed: 0,
      leftTime: 0,
    };
  },
  methods: {
    async handleFileUpload(event) {
      const file = event.target.files[0];
      this.file = file;
      this.progressLoad = false;
      this.percentage = 0;
    },

    async uploadFile() {
      this.percentage = 0;
      const formData = new FormData();
      formData.append("file", this.file);
      this.progressLoad = true;
      let lastTime = 0; // 上一次计算时间
      let lastSize = 0; // 上一次计算的文件大小
      try {
        const response = await this.$axios.post("/api/upload", formData, {
          onUploadProgress: (progressEvent) => {
            /*验证数据*/
            if (lastTime == 0) {
              lastTime = new Date().getTime();
              lastSize = progressEvent.loaded;
              return;
            }
            /*计算间隔*/

            var nowTime = new Date().getTime();

            var intervalTime = (nowTime - lastTime) / 1000; // 时间单位为毫秒,需转化为秒

            var intervalSize = progressEvent.loaded - lastSize;
            /*重新赋值以便于下次计算*/

            lastTime = nowTime;

            lastSize = progressEvent.loaded;

            /*计算速度*/

            var speed = intervalSize / intervalTime;

            var bSpeed = speed; // 保存以b/s为单位的速度值,方便计算剩余时间
            var units = "b/s"; // 单位名称

            if (speed / 1024 > 1) {
              speed = speed / 1024;

              units = "k/s";
            }

            if (speed / 1024 > 1) {
              speed = speed / 1024;

              units = "M/s";
            }

            /*计算剩余时间*/

            var leftTime =
              (progressEvent.total - progressEvent.loaded) / bSpeed;

            /*计算进度*/

            var progress = parseInt((progressEvent.loaded / progressEvent.total) * 100);
            this.percentage = progress;
            this.speed = speed.toFixed(1) + units;
            this.leftTime = leftTime.toFixed(1) + "秒";
            console.log(
              "当前进度:" +
                progress.toFixed(1) +
                "%    当前速度:" +
                speed.toFixed(1) +
                units +
                "   预计剩余时间:" +
                leftTime.toFixed(1) +
                "秒"
            );
          },
        });
        if (response.data.status == 200) {
          this.$message({
            message: "上传成功",
            type: "success",
            dangerouslyUseHTMLString: true,
          });
        } else {
          this.$message({
            message: "上传失败",
            type: "error",
            dangerouslyUseHTMLString: true,
          });
        }
        this.progressLoad = false;
      } catch (error) {
        console.log(error);
      }
    },
  },
};
</script>

1.3.style

<style scoped>
fieldset {
  /* 表单页面居中,宽度50% ,legend颜色设置,legend圆角*/
  border: 2px solid #dcdfe6;
  text-align: left;
  border-radius: 8px;
  margin: 0 auto;
  width: 50%;
}
</style>

1.4.后端接口

如果想要后端接口请点击如下的连接

SpringtBoot实现文件上传

二.效果

在这里插入图片描述

实现文件上传进度通常需要使用前后端配合完成,具体步骤如下: 1. 前端实现 前端可以使用 axios 或者 fetch 等库发送文件上传请求,并监听上传进度,示例代码如下: ```javascript // 使用 axios 发送文件上传请求 const formData = new FormData() formData.append('file', inputFile.files[0]) // inputFile 为文件上传框 axios.post('/api/upload', formData, { onUploadProgress: progressEvent => { // 计算上传进度 const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total) console.log(`上传进度:${percentCompleted}%`) } }) ``` 2. 后端实现 后端可以使用 Spring Boot 或者其他框架接收上传文件,并返回上传进度,示例代码如下: ```java @RestController public class UploadController { @PostMapping("/api/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) throws IOException { // 处理上传文件 // ... // 返回上传进度 return ResponseEntity.ok().header("X-Upload-Progress", "50").build() } } ``` 在返回的 ResponseEntity 中通过 header 带上 X-Upload-Progress 参数来返回上传进度前端可以通过监听 response 的 headers 事件获取上传进度,示例代码如下: ```javascript axios.post('/api/upload', formData, { onUploadProgress: progressEvent => { // 计算上传进度 const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total) console.log(`上传进度:${percentCompleted}%`) } }).then(response => { const uploadProgress = parseInt(response.headers['x-upload-progress']) || 100 console.log(`上传进度:${uploadProgress}%`) }) ``` 这样就可以在前端和后端配合完成文件上传进度的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值