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日

相关文章

  • vue实现搜索关键词高亮的详细教程

    下面是“vue实现搜索关键词高亮的详细教程”的完整攻略。 一、需求分析 我们需要实现一个搜索功能,在用户搜索关键词后,将页面中匹配到的关键词高亮显示。 二、实现过程 1. HTML结构 首先,我们需要在HTML中准备好需要搜索的容器,并且将搜索结果渲染到容器中。 <div class="search-container"> &…

    Vue 2023年5月27日
    00
  • Mpvue中使用Vant Weapp组件库的方法步骤

    使用Vant Weapp组件库的方法步骤: 安装Vant Weapp 在cmd中进入mpvue项目根目录,执行以下命令进行安装: npm install vant-weapp -S –production 在 App.vue 中引入 Vant Weapp 在 App.vue 的 script 标签中如下添加: import Vant from ‘vant-…

    Vue 2023年5月27日
    00
  • Vue中的异步组件函数实现代码

    Vue中的异步组件函数实现可以通过工厂函数来实现。在该工厂函数中,可以使用动态导入实现异步加载组件,以提高网站性能并减少首屏加载时间。 下面我们来介绍一下具体实现步骤: 步骤一:定义组件 首先,我们需要先在 Vue 中定义一个组件。可以通过以下代码来实现: <template> <div> <h2>{{ title }}&…

    Vue 2023年5月28日
    00
  • Vue手写防抖和节流函数代码详解

    针对你提出的主题 “Vue手写防抖和节流函数代码详解”,我来进行详细讲解。 一、什么是防抖和节流函数 在前端开发中,很多时候会遇到一些需要节流或防抖的场景,例如在频繁进行搜索时,可以使用节流函数,减少无意义的请求;在监听窗口 resize 或滚动事件等操作时,可以使用防抖函数避免频繁执行代码。两种函数的作用如下: 防抖函数:多次触发事件后,函数只会执行一次,…

    Vue 2023年5月28日
    00
  • 一起写一个即插即用的Vue Loading插件实现

    下面是“一起写一个即插即用的Vue Loading插件实现”的完整攻略。 确定插件的使用方式和效果 首先要确定我们的插件要如何使用以及要实现的效果。在这个过程中,需要考虑以下几个方面: 插件的使用方式:Vue插件可以通过 Vue.use() 方法进行安装,因此我们需要确定插件的安装方式和参数。 插件的效果:我们的Vue Loading插件需要实现的效果是,在…

    Vue 2023年5月29日
    00
  • JavaScript设计模式之原型模式分析【ES5与ES6】

    JavaScript设计模式之原型模式分析【ES5与ES6】 什么是原型模式? 在JavaScript中,每个对象都有原型(prototype)属性。原型是一个对象,其他对象可以通过它来继承属性和方法。原型模式就是通过原型来创建新对象的模式。 原型模式是一种创建型设计模式,它允许我们通过克隆现有对象的方式来创建新对象,而不是通过使用构造函数创建。 实现原型模…

    Vue 2023年5月28日
    00
  • vue实现列表无缝循环滚动

    关于“vue实现列表无缝循环滚动”的攻略,以下是详细说明: 1. 背景 在日常开发中,我们经常需要实现列表的滚动,并且有时需要实现无缝循环滚动。而vue框架提供了非常方便的实现方式。 2. 实现方案 2.1 方案一 步骤一:数据处理 首先,我们需要在vue的data中定义一个列表数据,并将其从末尾插入到列表头部。 // vue组件中data定义列表数据 da…

    Vue 2023年5月27日
    00
  • Vue打包后不同版本详细解析

    让我们来详细讲解“Vue打包后不同版本详细解析”的完整攻略。 什么是Vue打包 Vue打包是将Vue应用程序的源代码转换为优化的、最终可执行的Javascript代码的一个过程。这个过程主要由构建工具webpack完成,webpack会根据配置文件对Vue应用程序进行各种处理,包括代码的压缩、模块化打包、样式打包等等。 打包后的版本有哪些 打包后的版本有两种…

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