vue项目中实现多文件上传功能实例代码

下面是“vue项目中实现多文件上传功能实例代码”的完整攻略:

实现思路

Vue 项目中实现多文件上传功能,需要联合使用 HTML5 的 FileReader API 和 axios 来实现。实现思路如下:

  1. 通过 input 标签接收用户上传的文件。
  2. 把文件列表存储到 vue 组件的 data 中,通过 v-for 循环来渲染上传列表。
  3. 使用 FileReader 将文件转换为二进制格式并存储到 vue 组件的 data 中。
  4. 通过 axios 发送请求,将文件上传到服务器,并处理上传进度和上传结果。

代码实现

首先,在 vue 组件中定义一个 fileList 数组,用于存储用户选择的文件和上传进度:

<template>
  <div>
    <input type="file" multiple @change="handleChange">
    <div v-for="(file, index) in fileList" :key="index">
      {{ file.name }} - {{ file.progress }}%
    </div>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      fileList: [],
    };
  },
  methods: {
    handleChange(event) {
      // 遍历用户选择的文件列表
      for (let i = 0; i < event.target.files.length; i++) {
        const file = event.target.files[i];
        // 将文件存储到 fileList 数组中
        this.fileList.push({
          name: file.name,
          size: file.size,
          type: file.type,
          progress: 0,
        });

        // 将文件转换为二进制格式并存储到 fileList 数组中
        const reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function() {
          const result = reader.result;
          const item = this.fileList.find(
            item => item.name === file.name && item.size === file.size && item.type === file.type
          );
          item.raw = result.split(',')[1];
        }.bind(this);

        // 发送异步请求,将文件上传到服务器
        const formData = new FormData();
        formData.append('file', file);
        axios.post('/upload', formData, {
          onUploadProgress: progressEvent => {
            const progress = Math.round((progressEvent.loaded / progressEvent.total) * 100);
            // 更新进度
            this.fileList.find(
              item => item.name === file.name && item.size === file.size && item.type === file.type
            ).progress = progress;
          },
        });
      }
    },
  },
};

其中,handleChange 方法用于响应用户上传文件的事件,遍历用户选择的文件列表,将每个文件存储到 fileList 数组中,并使用 FileReader 将文件转换为二进制格式并存储到 fileList 数组中。同时,将文件上传到服务器,并更新上传进度。

需要注意的是,在处理上传进度时,需要根据文件的名称、大小和类型来查找对应的 fileList 数组中的元素,并更新其进度。

下面是一个示例,展示了如何使用上述代码实现一个多文件上传组件。

示例

在例子中,我们将使用 Element UI 来渲染上传按钮,并使用 Node.js 和 Express 来模拟服务器端:

<template>
  <div>
    <el-upload
      class="upload-demo"
      drag
      multiple
      action="/upload"
      :on-progress="handleProgress"
      :on-success="handleSuccess"
    >
      <i class="el-icon-upload"></i>
      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
      <div class="el-upload__tip" slot="tip">上传文件格式为 xls、xlsx、csv、txt</div>
    </el-upload>
  </div>
</template>

<script>
import axios from "axios";

export default {
  methods: {
    handleProgress(event, file, fileList) {
      const uploadItem = this.$refs.upload.$children[0].$refs[file.uid];

      if (uploadItem) {
        uploadItem.currentUpload.progress = (event.loaded / event.total * 100).toFixed(2);
      }
    },
    handleSuccess(response, file, fileList) {
      const uploadItem = this.$refs.upload.$children[0].$refs[file.uid];

      if (uploadItem) {
        uploadItem.currentUpload.progress = 100;

        if (response.code === 200) {
          uploadItem.currentUpload.status = "success";
        } else {
          uploadItem.currentUpload.status = "fail";
        }
      }
    }
  }
};
</script>

<style scoped>
/* 这里是样式,可以忽略 */
.el-upload__tip {
  margin-top: 10px;
  font-size: 12px;
  color: #606266;
}
</style>

其中,我们使用了 Element UI 组件库提供的 Upload 组件,并通过设置 dragmultiple 属性来实现多文件上传。设置 action 属性来指定上传文件的服务器地址。通过设置 on-progress 事件来处理上传进度。通过设置 on-success 事件来处理上传结果。

需要注意的是,由于 Element UI 组件库并没有提供直接访问当前上传文件的 API,因此,在处理进度和结果时,需要使用 $refs 来获取 Upload 组件中当前文件上传状态对象的引用。

在 Node.js 中,可以使用 multer 中间件来处理前端发来的上传文件:

const express = require('express');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

const app = express();

app.post('/upload', upload.single('file'), (req, res) => {
  // 处理上传文件
  // ...
  res.json({
    code: 200,
  });
});

app.listen(3000, () => {
  console.log('Server is running at http://localhost:3000');
});

需要注意的是,multer 中间件中的 dest 选项指定了上传文件的存储路径。在实际项目中,需要根据实际需求来设置此选项。

以上就是实现多文件上传功能的完整攻略和示例,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue项目中实现多文件上传功能实例代码 - Python技术站

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

相关文章

  • TypeScript在Vuex4中使用TS实战分享

    当使用Vue框架时,使用Vuex作为状态管理可以方便的帮助我们管理应用程序中的所有数据。而在Vuex 4中可以使用TypeScript简化代码。 以下是在Vuex 4中使用TypeScript的完整攻略: 准备工作 首先安装最新版本的Vue CLI: npm i -g @vue/cli 然后创建一个新的Vue项目: vue create vuex-ts-de…

    Vue 2023年5月28日
    00
  • 基于cornerstone.js的dicom医学影像查看浏览功能

    下面我将为大家分享基于cornerstone.js的dicom医学影像查看浏览功能的完整攻略: 简介 DICOM(Digital Imaging and Communications in Medicine)是医学影像和相关信息的国际标准,它定义了医学影像的格式、传输协议以及元数据等信息,被广泛应用于医学领域。在web应用中,通常需要通过浏览器对DICOM医…

    Vue 2023年5月28日
    00
  • vue中的inject学习教程

    关于“vue中的inject学习教程”的完整攻略,我们可以分为以下几个部分进行讲解: 一、inject的作用 inject 是在 Vue.js 上层组件向其下层子组件注入数据的方式。它支持我们在子组件中访问父组件的数据,不管层级有多深,而不需要一层层通过 prop 或事件来传递。因此,inject 及其衍生出的 provide 可以在一定程度上解决跨组件之间…

    Vue 2023年5月28日
    00
  • vue中后端做Excel导出功能返回数据流前端的处理操作

    为了实现Vue中后端做Excel导出功能返回数据流前端的处理操作,我们需要在后端生成Excel文件,并将其返回给前端,前端再将返回的数据流进行处理,以生成Excel文件。具体的步骤如下所述: 后端生成Excel文件 我们可以使用开源的Excel处理库,在后端生成Excel文件。例如,我们可以使用phpspreadsheet这个库来生成Excel文件。首先,需…

    Vue 2023年5月27日
    00
  • axios封装与传参示例详解

    针对题目“axios封装与传参示例详解”,我将分以下几个部分进行详细讲解: 什么是axios及其用途 axios的基本用法 axios的封装原理及方法 axios传参的详解及示例 1. 什么是axios及其用途 axios是一个基于Promise的HTTP请求客户端,可以用于浏览器和Node.js。它具有以下优点: 可同时在浏览器和Node.js中使用。 能…

    Vue 2023年5月28日
    00
  • vue keep-alive的简单总结

    下面我来为你详细讲解 “Vue Keep-alive 的简单总结”攻略。 什么是 Vue Keep-alive? Vue Keep-alive是 Vue 组件中的一个内置组件。它的作用是用来缓存组件,能够保留它们的状态或避免重新渲染。通俗来说,就是把需要缓存的组件分别缓存起来,当需要重新渲染这些组件时,从缓存里面调用,而不是重新渲染一个新的组件。 Vue K…

    Vue 2023年5月27日
    00
  • vue3 中 computed 新用法示例小结

    下面是关于”vue3 中 computed 新用法示例小结”的完整攻略: 什么是 computed 在 Vue.js 中,我们可以通过计算属性来简化模板中的表达式,避免过多的逻辑计算,提高代码可维护性。computed 可以自动监听依赖变化,只有当依赖的值发生变化时,才会重新计算返回值。 在 Vue.js 3.0 中,computed 有了几个新的方法和特性…

    Vue 2023年5月28日
    00
  • Vue2 响应式系统之异步队列

    当我们修改 Vue 实例数据时,Vue 会根据监听的数据属性触发响应式更新。Vue 2.x 的响应式系统包含依赖追踪和异步队列两个部分,其中异步队列主要负责缓存数据变更并批量更新 DOM,以最小代价更新视图。具体来说,异步队列可以将同一事件循环中的数据变更缓存起来,避免了对于同一数据进行多次 DOM 更新,降低了性能消耗。而且通过微任务让 DOM 更新在下一…

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