当前位置:首页 > VUE

vue实现上传进度

2026-01-17 08:04:16VUE

Vue 实现文件上传进度

在 Vue 中实现文件上传进度可以通过 XMLHttpRequestaxiosonUploadProgress 事件来监听上传进度。以下是两种常见实现方式:

使用 XMLHttpRequest 实现

通过原生 XMLHttpRequest 对象的 upload 属性监听进度事件:

// 在 Vue 方法中
uploadFile(file) {
  const xhr = new XMLHttpRequest();
  const formData = new FormData();
  formData.append('file', file);

  xhr.upload.addEventListener('progress', (event) => {
    if (event.lengthComputable) {
      const percent = Math.round((event.loaded / event.total) * 100);
      this.uploadProgress = percent; // 更新进度状态
    }
  });

  xhr.open('POST', '/api/upload', true);
  xhr.send(formData);
}

模板中显示进度:

<progress :value="uploadProgress" max="100"></progress>
<span>{{ uploadProgress }}%</span>

使用 Axios 实现

Axios 提供了 onUploadProgress 回调,更适合 Vue 项目:

import axios from 'axios';

// 在 Vue 方法中
async uploadFile(file) {
  const formData = new FormData();
  formData.append('file', file);

  try {
    const response = await axios.post('/api/upload', formData, {
      onUploadProgress: (progressEvent) => {
        const percent = Math.round(
          (progressEvent.loaded * 100) / progressEvent.total
        );
        this.uploadProgress = percent;
      },
    });
    console.log('上传成功', response.data);
  } catch (error) {
    console.error('上传失败', error);
  }
}

组件化实现示例

封装一个可复用的上传组件:

vue实现上传进度

<template>
  <div>
    <input type="file" @change="handleFileChange" />
    <button @click="uploadFile">上传</button>
    <div v-if="uploadProgress > 0">
      <progress :value="uploadProgress" max="100"></progress>
      {{ uploadProgress }}%
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedFile: null,
      uploadProgress: 0,
    };
  },
  methods: {
    handleFileChange(event) {
      this.selectedFile = event.target.files[0];
    },
    async uploadFile() {
      if (!this.selectedFile) return;

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

      try {
        await axios.post('/api/upload', formData, {
          onUploadProgress: (progressEvent) => {
            this.uploadProgress = Math.round(
              (progressEvent.loaded * 100) / progressEvent.total
            );
          },
        });
        this.$emit('upload-success');
      } catch (error) {
        this.$emit('upload-error', error);
      }
    },
  },
};
</script>

注意事项

  1. 跨域问题:确保后端支持 CORS 并正确配置 Access-Control-Allow-Origin
  2. 文件大小限制:后端需处理大文件上传(如分片上传)。
  3. 进度准确性:部分服务器可能无法返回准确的 content-length,需测试验证。
  4. UI 反馈:建议结合加载状态或错误提示(如 v-if="uploadProgress === 100")。

通过上述方法,可以轻松在 Vue 中实现文件上传进度功能。

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

相关文章

jquery 上传

jquery 上传

jQuery 文件上传方法 使用 jQuery 实现文件上传可以通过多种方式完成,以下是常见的几种方法: 使用原生表单和 AJAX 创建一个包含文件输入的表单,并通过 jQuery 的 AJAX…

vue实现扇形进度

vue实现扇形进度

Vue 实现扇形进度条 使用 SVG 绘制扇形 SVG 的 path 元素可以用于绘制扇形。通过计算扇形的路径数据,结合 Vue 的动态数据绑定实现进度变化。 <template>…

php实现视频上传

php实现视频上传

视频上传功能实现 使用PHP实现视频上传功能需要处理文件接收、验证、存储等步骤。以下是具体实现方法: 创建HTML表单 前端表单需要设置enctype="multipart/form-data"以支…

vue实现上传按钮

vue实现上传按钮

Vue 实现上传按钮的方法 使用原生 HTML input 和 Vue 处理 通过 HTML 的 input 元素结合 Vue 的事件处理实现文件上传功能。 <template> &…

vue实现音乐上传

vue实现音乐上传

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