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

yizhihongxing

下面是“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的状态控制与延时加载刷新 在Vue中,状态控制和延时加载刷新是非常常见的需求。下面我将针对这两个问题进行详细讲解。 状态控制 在Vue中,状态控制可以通过data属性来进行。对于一个组件内需要使用的状态变量,我们可以先在data对象中定义: data() { return { count: 0, message: ‘Hello Vue!’ } } …

    Vue 2023年5月29日
    00
  • ant design vue datepicker日期选择器中文化操作

    为了在ant design vue datepicker日期选择器中文化操作,你需要以下步骤: 步骤一:安装moment.js和ant-design-vue包 首先,你需要在你的项目中安装moment.js和ant-design-vue: npm install moment ant-design-vue –save 在上面的代码中,我们使用了npm包管理…

    Vue 2023年5月29日
    00
  • springboot跨域问题解决方案

    下面是关于springboot跨域问题的解决方案完整攻略。 背景 在前后端分离的开发模式中,前端项目和后端项目通常会分别部署到不同的域名下,因此会出现跨域请求的问题。这时候就需要解决跨域问题。 解决方案 1. 添加跨域支持的Filter Spring Boot提供了一种通过Filter来实现跨域请求的解决方案,步骤如下: 创建一个继承自OncePerRequ…

    Vue 2023年5月28日
    00
  • vue使用ajax获取后台数据进行显示的示例

    使用 Vue.js 进行前端开发时,常常需要从后端获取数据,并将其显示在页面上。其中一个常用的方式是通过 Ajax 技术向后端服务器发送 HTTP 请求,在得到响应后在前端页面上进行展示。下面是使用 Vue.js 实现向后端服务器发送 Ajax 请求并将其返回结果显示在页面上的示例攻略。 1. 在 Vue.js 中使用 Ajax Vue.js 提供了内置的 …

    Vue 2023年5月28日
    00
  • Vue中使用JsonView来展示Json树的实例代码

    下面是关于“Vue中使用JsonView来展示Json树的实例代码”完整攻略的详细解释: 什么是JsonView? JsonView(也称为JSON Viewer)是一种用于查看JSON数据的工具,它可以将JSON格式的数据转化为可读性高的树状结构。在Vue中,我们可以借助JsonView插件来展示JSON数据的树状结构,让JSON数据更加易读易操作。 安装…

    Vue 2023年5月28日
    00
  • vue使用iframe嵌入网页的示例代码

    下面我会给出一个使用Vue实现在页面中嵌入iframe的完整攻略。具体步骤如下: 1.在 Vue 项目中安装 iframe-resizer 库。 npm install iframe-resizer –save 2.在需要嵌入 iframe 的组件中,引用 iframe-resizer 库。 import iframeResizer from ‘ifram…

    Vue 2023年5月28日
    00
  • 解决在Vue中使用axios用form表单出现的问题

    当在Vue项目中使用axios进行POST请求时,经常会遇到使用表单提交数据的情况,但是,表单需要以特定格式进行编码,否则服务器无法正常解析表单内容。本文将为大家详细讲解如何解决这一问题。 问题描述 我们在使用axios进行POST请求时,一般需要将数据封装在一个对象参数中,如下所示: axios.post(‘/api/login’, { username:…

    Vue 2023年5月28日
    00
  • vue组件间传值的方法你知道几种

    当我们使用Vue.js框架时,组件和组件间的通信常常需要使用传值方法来完成。下面将介绍Vue组件间传值的多种方法。 Props Props是Vue中一种父子组件传递数据的方式。父组件可以通过标签属性的形式把数据传递给子组件,子组件通过props来接收这些数据。 例如,父组件中这样写: <template> <div> <chil…

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