Vue.js实现文件上传和进度条显示功能

 更新时间:2024年11月07日 09:20:32   作者:JJCTO袁龙  
在现代Web开发中,文件上传是一个常见而重要的需求,无论是在用户上传头像、文档或者其他类型的文件时,良好的用户体验都是至关重要的,在这篇博客中,我们将介绍如何使用Vue.js来实现文件上传功能,同时显示上传进度条,需要的朋友可以参考下

Vue.js实现文件上传和进度条显示功能

在现代Web开发中,文件上传是一个常见而重要的需求。无论是在用户上传头像、文档或者其他类型的文件时,良好的用户体验都是至关重要的。在这篇博客中,我们将介绍如何使用Vue.js来实现文件上传功能,同时显示上传进度条,让用户清楚地看到上传的进展。

项目准备

首先,我们需要创建一个新的Vue项目。如果你还没有安装Vue CLI,可以使用以下命令来安装```bash
npm install -g @vue/cli

接下来,创建一个新的Vue项目:

vue create file-upload-demo

进入项目目录:

cd file-upload-demo

启动开发服务器:

npm run serve

现在你应该可以在浏览器中访问 http://localhost:8080,看到一个新的Vue应用程序的默认界面。

文件上传组件

接下来,我们将创建一个文件上传组件。新建一个名为 FileUpload.vue 的文件并在 src/components/ 目录中添加以下代码:

<template>
  <div class="file-upload">
    <h2>文件上传</h2>
    <input type="file" @change="handleFileChange" />
    <button @click="uploadFile">上传</button>
    <div v-if="uploadProgress > 0">
      <p>上传进度: {{ uploadProgress }}%</p>
      <div class="progress-bar">
        <div class="progress" :style="{ width: uploadProgress + '%' }"></div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedFile: null,
      uploadProgress: 0,
    };
  },
  methods: {
    handleFileChange(event) {
      this.selectedFile = event.target.files[0];
    },
    async uploadFile() {
      if (!this.selectedFile) {
        alert("请选择一个文件上传!");
        return;
      }

      const formData = new FormData();
      formData.append("file", this.selectedFile);

      try {
        const response = await this.$http.post("/upload", formData, {
          headers: {
            "Content-Type": "multipart/form-data",
          },
          onUploadProgress: (progressEvent) => {
            this.uploadProgress = Math.round(
              (progressEvent.loaded * 100) / progressEvent.total
            );
          },
        });

        if (response.status === 200) {
          alert("文件上传成功!");
             } catch (error) {
        console.error("上传失败:", error);
        alert("文件上传失败,请重试!");
      }
    },
  },
};
</script>

<style scoped>
.file-upload {
  max-width: 400px;
  margin: 0 auto;
  text-align: center;
}
.progress-bar {
  background-color: #f3f3f3;
  border-radius: 4px;
  height: 20px;
  margin-top: 10px;
}
.progress {
  background-color: #4caf50;
  height: 100%;
  border-radius: 4px;
}
</style>

代码解析

  1. 模板部分

    • 我们使用一个文件输入框让用户选择文件,绑定事件处理函数 handleFileChange
    • 提供一个按钮用于触发文件上传。
    • 当 uploadProgress 大于0时,就显示上传进度。
  2. 数据部分

    • selectedFile: 存储用户选择的文件。
    • uploadProgress: 存储当前文件上传的进度。
  3. 方法部分

    • handleFileChange(event): 处理文件选择,记录用户选择的文件。
    • uploadFile(): 进行文件上传,通过 axios 发送一个 POST 请求,利用 FormData 处理文件上传,同时支持进度监控。

依赖安装

为了让我们能够发送HTTP请求,我们需要安装Axios。使用以下命令安装:

npm install axios

然后,在 main.js 文件或具体的组件中引入并配置Axios:

import axios from "axios";
import Vue from "vue";

Vue.prototype.$http = axios.create({
  baseURL: "http://localhost:5000", // 你可以根据实际情况修改
});

服务器端代码(可选)

为了测试文件上传功能,我们需要一个服务器端来处理文件上传。这里提供一个简单的Node.js服务器端代码。

创建一个新的文件 server.js,并添加以下代码:

const express = require("express");
const multer = require("multer");
const path = require("path");

const app = express();
const port = 5000;

// 文件存储配置
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "uploads/");
  },
  filename: (req, file, cb) => {
    cb(null, file.originalname);
  },
});

const upload = multer({ storage: storage });

app.post("/upload", upload.single("file"), (req, res) => {
  res.send("文件上传成功!");
});

app.listen(port, () => {
  console.log(`服务器正在运行,访问 http://localhost:${port}`);
});

启动服务器

你需要在同一目录下安装Express和Multer:

npm install express multer

然后使用以下命令启动服务器:

node server.js

整合组件

最后,在 App.vue 中引入我们创建的 FileUpload 组件:

<template>
  <div id="app">
    <FileUpload />
  </div>
</template>

<script>
import FileUpload from './components/FileUpload'

export default {
  components: {
    FileUpload
  }
}
</script>

结论

到此,我们已经成功构建了一个简单的文件上传组件,用户可以通过它选择文件并查看上传进度。这种方式在实际开发中广泛使用,并且通过Vue.js和Axios的结合,提升了用户体验。

以上就是Vue.js实现文件上传和进度条显示功能的详细内容,更多关于Vue.js文件上传和进度条的资料请关注脚本之家其它相关文章!

相关文章

  • Vue3 携手 TypeScript 搭建完整项目结构

    Vue3 携手 TypeScript 搭建完整项目结构

    TypeScript 是JS的一个超级,主要提供了类型系统和对ES6的支持,使用 TypeScript 可以增加代码的可读性和可维护性,在 react 和 vue 社区中也越来越多人开始使用TypeScript,这篇文章主要介绍了Vue3 携手 TypeScript 搭建完整项目结构,需要的朋友可以参考下
    2022-04-04
  • 解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题

    解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题

    这篇文章主要介绍了vue 格式化银行卡(信用卡)每4位一个符号隔断的问题,本文给大家分享了解决方法,需要的朋友可以参考下
    2018-09-09
  • 详解vuex 渐进式教程实例代码

    详解vuex 渐进式教程实例代码

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。通过本文给大家分享vuex 渐进式教程实例代码,从入门级带你慢慢深入使用vuex,感兴趣的朋友一起看看吧
    2018-11-11
  • vue实现element上传多张图片浏览删除功能

    vue实现element上传多张图片浏览删除功能

    这篇文章主要介绍了vue实现element上传多张图片浏览删除功能,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • Vue组件之全局组件与局部组件的使用详解

    Vue组件之全局组件与局部组件的使用详解

    本篇文章主要介绍了Vue组件之全局组件与局部组件的使用详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • vue组件style中scoped的作用及说明

    vue组件style中scoped的作用及说明

    这篇文章主要介绍了vue组件style中scoped的作用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • vue使用echart自定义标签以及颜色

    vue使用echart自定义标签以及颜色

    这篇文章主要为大家详细介绍了vue使用echart自定义标签以及颜色,应用于echart 5.0以上版本,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 详解vue 在移动端体验上的优化解决方案

    详解vue 在移动端体验上的优化解决方案

    这篇文章主要介绍了vue 在移动端体验上的优化解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • vue resource发送请求的几种方式

    vue resource发送请求的几种方式

    这篇文章主要介绍了vue resource发送请求的几种方式,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Vue3实现粒子动态背景的示例详解

    Vue3实现粒子动态背景的示例详解

    这篇文章主要为大家详细介绍了如何利用Vue3实现粒子动态背景,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-11-11

最新评论