当前位置:首页 > VUE

vue实现上传进度

2026-01-17 08:04:16VUE

Vue 实现文件上传进度

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

使用 XMLHttpRequest 实现

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

vue实现上传进度

// 在 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);
}

模板中显示进度:

vue实现上传进度

<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);
  }
}

组件化实现示例

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

<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 中实现文件上传进度功能。

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

相关文章

vue上传视频实现

vue上传视频实现

Vue 实现视频上传功能 安装依赖 确保项目中已安装 axios 或 vue-upload-component 等上传库。通过 npm 安装: npm install axios 前端组件实现 创…

jquery 上传

jquery 上传

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

jquery上传

jquery上传

jQuery 文件上传的实现方法 jQuery 可以通过多种方式实现文件上传功能,以下介绍几种常见的方法: 使用原生表单和 AJAX 通过 HTML 表单结合 jQuery 的 AJAX 功能实现文…

vue实现头像上传

vue实现头像上传

Vue 头像上传实现方法 使用 <input type="file"> 基础方法 创建文件输入控件并监听 change 事件: <template> <div>…

vue实现上传头像

vue实现上传头像

使用 Vue 实现上传头像 前端实现 创建一个文件上传组件,使用 <input type="file"> 元素选择文件,并通过 FileReader 预览图片。 <template…

vue 怎么实现上传

vue 怎么实现上传

Vue 实现文件上传的方法 使用原生 HTML5 文件上传 通过 <input type="file"> 元素结合 Vue 的数据绑定实现基础文件上传功能。 <template&g…