当前位置:首页 > VUE

vue实现上传进度

2026-03-09 13:16:24VUE

Vue 实现上传进度

在 Vue 中实现文件上传进度功能,通常需要结合 XMLHttpRequest 或第三方库(如 axios)来监听上传进度事件。以下是几种常见的实现方法:

使用原生 XMLHttpRequest

通过 XMLHttpRequestupload 属性可以监听上传进度事件。

<template>
  <div>
    <input type="file" @change="handleFileUpload" />
    <div v-if="progress > 0">
      上传进度: {{ progress }}%
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      progress: 0
    };
  },
  methods: {
    handleFileUpload(event) {
      const file = event.target.files[0];
      if (!file) return;

      const xhr = new XMLHttpRequest();
      const formData = new FormData();
      formData.append('file', file);

      xhr.upload.addEventListener('progress', (e) => {
        if (e.lengthComputable) {
          this.progress = Math.round((e.loaded / e.total) * 100);
        }
      });

      xhr.open('POST', '你的上传接口URL', true);
      xhr.send(formData);
    }
  }
};
</script>

使用 axios

axios 提供了 onUploadProgress 回调函数来监听上传进度。

<template>
  <div>
    <input type="file" @change="handleFileUpload" />
    <div v-if="progress > 0">
      上传进度: {{ progress }}%
    </div>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      progress: 0
    };
  },
  methods: {
    async handleFileUpload(event) {
      const file = event.target.files[0];
      if (!file) return;

      const formData = new FormData();
      formData.append('file', file);

      try {
        await axios.post('你的上传接口URL', formData, {
          onUploadProgress: (progressEvent) => {
            if (progressEvent.lengthComputable) {
              this.progress = Math.round(
                (progressEvent.loaded / progressEvent.total) * 100
              );
            }
          }
        });
        console.log('上传成功');
      } catch (error) {
        console.error('上传失败', error);
      }
    }
  }
};
</script>

使用 Element UI 的上传组件

如果项目中使用了 Element UI,可以直接使用其上传组件 el-upload,它内置了上传进度显示功能。

<template>
  <el-upload
    action="你的上传接口URL"
    :on-progress="handleUploadProgress"
    :before-upload="beforeUpload"
  >
    <el-button type="primary">点击上传</el-button>
    <div slot="tip">上传进度: {{ progress }}%</div>
  </el-upload>
</template>

<script>
export default {
  data() {
    return {
      progress: 0
    };
  },
  methods: {
    handleUploadProgress(event, file) {
      this.progress = Math.round(event.percent);
    },
    beforeUpload(file) {
      // 上传前的校验逻辑
      return true;
    }
  }
};
</script>

使用第三方库(如 vue-upload-component)

vue-upload-component 是一个专门为 Vue 设计的文件上传组件,支持上传进度显示。

vue实现上传进度

<template>
  <div>
    <file-upload
      ref="upload"
      v-model="files"
      @input-filter="inputFilter"
      @input-file="inputFile"
      :post-action="'你的上传接口URL'"
    >
      上传文件
    </file-upload>
    <div v-if="progress > 0">
      上传进度: {{ progress }}%
    </div>
  </div>
</template>

<script>
import FileUpload from 'vue-upload-component';

export default {
  components: {
    FileUpload
  },
  data() {
    return {
      files: [],
      progress: 0
    };
  },
  methods: {
    inputFilter(newFile, oldFile, prevent) {
      if (newFile && !oldFile) {
        // 文件选择后的处理
      }
    },
    inputFile(newFile, oldFile) {
      if (newFile && !oldFile) {
        this.progress = newFile.progress;
      }
    }
  }
};
</script>

注意事项

  • 确保后端接口支持文件上传,并正确处理 multipart/form-data 格式。
  • 如果需要显示更详细的进度信息(如上传速度),可以通过计算时间差和已上传数据量来实现。
  • 对于大文件上传,可以考虑分片上传或断点续传功能。

标签: 进度上传
分享给朋友:

相关文章

vue实现上传表哥

vue实现上传表哥

Vue 实现上传表格 在 Vue 中实现上传表格功能,通常涉及文件上传、文件解析(如 Excel 或 CSV)以及数据展示。以下是具体实现方法: 使用 Element UI 上传组件 Element…

vue实现文件的上传

vue实现文件的上传

文件上传的基本实现 在Vue中实现文件上传通常结合HTML的<input type="file">元素和FormData对象。通过监听文件选择事件获取文件对象,再通过AJAX或axios发…

vue实现进度审批

vue实现进度审批

Vue 实现进度审批功能 进度审批功能通常涉及表单提交、状态跟踪和交互反馈。以下是实现的基本思路和代码示例。 审批流程数据结构设计 使用对象数组存储审批步骤,每个步骤包含状态、审批人等信息: da…

vue实现切片上传

vue实现切片上传

切片上传的实现原理 切片上传是将大文件分割成多个小块(切片)分别上传,最后在服务端合并。这种方式能提高上传效率、支持断点续传和并发上传。 前端实现步骤 使用Vue实现切片上传需要借助File…

vue实现音乐上传

vue实现音乐上传

Vue 实现音乐上传功能 音乐上传功能通常涉及前端界面交互、文件选择、上传进度显示以及后端接口对接。以下是基于 Vue 的实现方法: 前端界面设计 使用 Vue 的模板语法创建一个简单的上传界面,包…

vue实现图片重新上传

vue实现图片重新上传

实现图片重新上传功能 在Vue中实现图片重新上传功能,通常涉及文件选择、预览、上传和重置等步骤。以下是一个完整的实现方案: 模板部分 <template> <div>…