vue+element-ui+axios多文件上传的实现并显示整体进度

yizhihongxing

下面我会详细讲解“vue+element-ui+axios多文件上传的实现并显示整体进度”的完整攻略,具体分为以下几个步骤:

第一步:安装所需依赖

在使用这种方式进行文件上传时,我们需要用到vue、element-ui和axios这几个主要的依赖。因此,首先需要在项目中安装它们:

npm install vue element-ui axios --save

第二步:在vue中实现上传文件的组件

我们可以通过封装一个组件来实现文件上传功能。该组件中应该包含以下内容:

  • 添加上传文件的表单组件,使用element-ui实现;

  • 配置el-upload的属性,其中action指向上传文件的接口,headers中设置请求头,multiple表示可以选择多个文件,show-file-list表示显示上传文件列表,on-progress表示上传进度回调函数;

  • 实现上传文件的方法,在该方法中调用axios实现文件上传,将返回的上传进度和文件信息进行保存;

  • 添加上传进度条组件,配合整体上传进度的展示;

这里给出一个示例代码,在代码中我们上传两个文件,同时展示整体上传进度的效果:

<template>
  <div>
    <el-upload
      class="upload-demo"
      action="https://jsonplaceholder.typicode.com/posts/"
      :headers="{Authorization: 'Bearer ' + token}"
      multiple
      show-file-list
      on-progress="handleProgress"
      :on-success="handleSuccess">
      <el-button slot="trigger" size="small" type="primary">点击上传</el-button>
      <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
    </el-upload>
    <el-progress :percentage="uploadPercentage" :status="uploadStatus" :stroke-width="2" type="circle" style="width: 50px;"/>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      token: '',
      uploadPercentage: 0,
      uploadStatus: '',
    }
  },
  methods: {
    handleProgress(event, file, fileList) {
      this.uploadPercentage = event.percent;
    },
    handleSuccess(response, file, fileList) {
      this.uploadPercentage = 0;
      this.uploadStatus = 'success';
      console.log(fileList);
    },
    async uploadFile(file) {
      let formData = new FormData();
      formData.append('file', file);
      let response = await axios.post('https://jsonplaceholder.typicode.com/posts/', formData, {
        headers: {
          'Content-Type': 'multipart/form-data',
          Authorization: 'Bearer ' + this.token,
        },
        onUploadProgress: (progressEvent) => {
          this.uploadPercentage = parseInt(Math.round((progressEvent.loaded * 100) / progressEvent.total));
        },
      });
      return response;
    },
  },
};
</script>

<style scoped>
.upload-demo {
  margin-bottom: 20px;
}
</style>

第三步:整体上传进度显示

在上传多个文件时,我们需要实现整体上传进度的展示。因此,我们可以通过计算上传的文件数量与成功上传的文件数量比值来实现整体上传进度的展示。

下面是示例代码,其中handleSuccess方法中的uploadedFiles为已上传的文件列表:

<script>
import axios from 'axios';

export default {
  data() {
    return {
      token: '',
      uploadPercentage: 0,
      uploadStatus: '',
      uploadedFiles: [],
      uploadedFilesCount: 0,
    }
  },
  methods: {
    handleProgress(event, file, fileList) {
      this.uploadPercentage = event.percent;
    },
    handleSuccess(response, file, fileList) {
      this.uploadPercentage = 0;
      this.uploadStatus = 'success';
      this.uploadedFiles.push(file);
      this.uploadedFilesCount = this.uploadedFiles.filter(item => item.status == 'success').length / fileList.length * 100;
      console.log(this.uploadedFiles);
    },
    async uploadFile(file) {
      let formData = new FormData();
      formData.append('file', file);
      let response = await axios.post('https://jsonplaceholder.typicode.com/posts/', formData, {
        headers: {
          'Content-Type': 'multipart/form-data',
          Authorization: 'Bearer ' + this.token,
        },
        onUploadProgress: (progressEvent) => {
          this.uploadPercentage = parseInt(Math.round((progressEvent.loaded * 100) / progressEvent.total));
        },
      });
      return response;
    },
  },
};
</script>

第四步:总结

通过上述步骤我们可以实现vue+element-ui+axios多文件上传的实现并显示整体进度。其中,主要需要注意的是在使用axios进行文件上传时,我们需要将提交的内容进行封装。另外,在组件中利用FileList管理上传文件列表,可以方便地进行文件上传管理。

以上是一个简单的示例,如果需要上传大量或者较大的文件,需要进行优化。比如,可以将文件分片上传、增加上传操作中断功能等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+element-ui+axios多文件上传的实现并显示整体进度 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue实现动态路由详细

    下面是关于“Vue实现动态路由详细”的完整攻略: 简介 Vue.js 是一套构建用户界面的渐进式框架,而动态路由是其中的一个非常实用的功能,它可以根据不同的参数动态的切换视图,从而达到更好的用户体验。 实现步骤 实现动态路由主要包括以下几个步骤: 配置路由参数 根据路由参数渲染页面 动态设置路由 配置路由参数 Vue 实现动态路由的第一步是配置路由参数,我们…

    Vue 2023年5月29日
    00
  • vue实现数字动态翻牌的效果(开箱即用)

    下面是详细讲解“vue实现数字动态翻牌的效果(开箱即用)”的完整攻略: 背景 数字翻牌是一种常见的数字展示方式,适用于数字金融类、计数器、抽奖等场景。在这里我们将使用Vue.js实现数字动态翻牌的效果。 实现思路 数字动态翻牌的效果主要要用到CSS3动画和Vue动态绑定数据。首先需要用CSS3设置数字的动态翻牌效果,在Vue中通过监听数据变化来触发数字动态翻…

    Vue 2023年5月27日
    00
  • Vuex中的Mutations的具体使用方法

    使用 Vuex 来管理 Vue.js 应用的状态,Mutations 是其中的一个重要概念,它可以对 Vuex 中的State状态进行修改,能够保证状态的唯一性以及状态的修改追踪。下面是“Vuex中的Mutations的具体使用方法”的完整攻略: Mutations是什么 在 Vuex 中,Mutation 就是一种修改状态的方法,它能够保证 Vuex 中的…

    Vue 2023年5月27日
    00
  • vue-router重写push方法,解决相同路径跳转报错问题

    在 Vue.js 路由中使用 router.push 方法进行路由导航时,如果跳转的路径和当前路径相同,则会直接报错。为了解决这个问题,我们可以重写 router.push 方法,使其能够处理相同路径跳转的情况。 重写 router.push 方法的具体步骤如下: 手动创建一个新的 push 方法 在新的 push 方法中判断跳转路径是否和当前路径相同 如果…

    Vue 2023年5月28日
    00
  • VUE实现时间轴播放组件

    下面我来为您讲解VUE实现时间轴播放组件的完整攻略。 步骤一:初始化项目并安装依赖 首先,我们需要在本地初始化一个Vue项目并安装依赖: vue create my-timeline-app cd my-timeline-app npm install vue2-vis vis-data vis-timeline –save 我们使用了一个名为vis的第三…

    Vue 2023年5月29日
    00
  • Vue中引入样式文件的方法

    当我们使用Vue框架来构建前端应用时,经常需要引入样式文件来美化页面样式。在Vue中引入样式文件的方法有以下几种: 引入全局样式文件 我们可以将全局样式文件引入到Vue项目的入口文件(比如main.js文件)中。这样可以让这些样式在所有Vue组件中都可用。 // main.js文件 import Vue from "vue"; impor…

    Vue 2023年5月28日
    00
  • vue组件暴露和.js文件暴露接口操作

    Vue组件暴露 在 Vue 的开发过程中,封装组件是必不可少的一项技能。将组件封装后,我们通常需要将组件暴露出来,使得其他地方可以引用使用。下面是Vue组件暴露的完整攻略: 1. 全局组件 在Vue中,我们可以使用Vue.component()方法来注册全局组件。这样注册后,整个应用的任何组件都可以使用这个组件。 // 定义全局组件 Vue.componen…

    Vue 2023年5月28日
    00
  • vue 解决数组赋值无法渲染在页面的问题

    当 Vue 绑定的数据是一个数组时,使用原生的赋值方式(例如 array[0] = newValue)并不会触发组件的重新渲染,因为 Vue 无法识别这种方式的数据变动。为了解决这种问题,需要使用 Vue 提供的特殊方法,或在代码层面做出一些调整。 下面是解决数组赋值无法渲染在页面的问题的完整攻略: 1. 使用特殊方法进行数组数据更新 Vue 提供了一些特殊…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部