当前位置:首页 > VUE

vue实现上传进度

2026-03-09 13:16:24VUE

Vue 实现上传进度

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

使用原生 XMLHttpRequest

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

vue实现上传进度

<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 回调函数来监听上传进度。

vue实现上传进度

<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 设计的文件上传组件,支持上传进度显示。

<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 格式。
  • 如果需要显示更详细的进度信息(如上传速度),可以通过计算时间差和已上传数据量来实现。
  • 对于大文件上传,可以考虑分片上传或断点续传功能。

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

相关文章

jquery上传

jquery上传

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

vue实现上传视频

vue实现上传视频

使用 <input type="file"> 实现基础上传 通过 HTML 原生文件选择控件获取视频文件,结合 Vue 处理上传逻辑。 <template> <…

vue实现上传封面

vue实现上传封面

Vue 实现上传封面功能 使用原生 input 文件上传 在 Vue 中可以通过原生 HTML 的 input 元素实现文件上传功能。创建一个文件输入框,监听 change 事件获取用户选择的文件。…

vue实现批量上传

vue实现批量上传

Vue 实现批量上传的方法 使用 <input type="file"> 和 multiple 属性 在 Vue 模板中添加一个文件输入框,设置 multiple 属性以允许选择多个文件。…

vue实现附件上传

vue实现附件上传

文件上传的基本实现 在Vue中实现文件上传可以通过原生HTML的<input type="file">元素结合Vue的数据绑定和事件处理来完成。创建一个文件上传组件,监听change事件获…

vue实现excel上传预览

vue实现excel上传预览

vue实现excel上传预览的方法 使用xlsx库解析Excel文件 安装xlsx库来处理Excel文件: npm install xlsx 在Vue组件中引入xlsx库: import * as…