元素和 FormData 对象来处理文件上传。
当前位置:首页 > VUE

vue node实现文件上传

2026-01-20 07:31:58VUE

Vue 和 Node.js 实现文件上传

前端部分(Vue)

在 Vue 中,可以使用 <input type="file"> 元素和 FormData 对象来处理文件上传。

<template>
  <div>
    <input type="file" @change="handleFileChange" />
    <button @click="uploadFile">上传文件</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      file: null
    };
  },
  methods: {
    handleFileChange(event) {
      this.file = event.target.files[0];
    },
    async uploadFile() {
      if (!this.file) return;

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

      try {
        const response = await fetch('http://localhost:3000/upload', {
          method: 'POST',
          body: formData
        });
        const result = await response.json();
        console.log('上传成功:', result);
      } catch (error) {
        console.error('上传失败:', error);
      }
    }
  }
};
</script>

后端部分(Node.js)

在 Node.js 中,可以使用 Express 框架和 multer 中间件来处理文件上传。

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

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

app.post('/upload', upload.single('file'), (req, res) => {
  if (!req.file) {
    return res.status(400).json({ error: '没有上传文件' });
  }

  const fileInfo = {
    filename: req.file.filename,
    originalname: req.file.originalname,
    size: req.file.size,
    mimetype: req.file.mimetype
  };

  res.json({ message: '文件上传成功', file: fileInfo });
});

app.listen(3000, () => {
  console.log('服务器运行在 http://localhost:3000');
});

文件存储配置

如果需要自定义文件存储路径和文件名,可以配置 multer 的存储选项。

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/');
  },
  filename: function (req, file, cb) {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);
    cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname));
  }
});

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

文件类型限制

可以添加文件类型验证,只允许特定类型的文件上传。

const fileFilter = (req, file, cb) => {
  const allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
  if (allowedTypes.includes(file.mimetype)) {
    cb(null, true);
  } else {
    cb(new Error('文件类型不支持'), false);
  }
};

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

进度显示(前端)

如果需要显示上传进度,可以使用 axios 和其上传进度事件。

vue node实现文件上传

import axios from 'axios';

methods: {
  async uploadFile() {
    const formData = new FormData();
    formData.append('file', this.file);

    try {
      const response = await axios.post('http://localhost:3000/upload', formData, {
        onUploadProgress: progressEvent => {
          const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
          console.log('上传进度:', percentCompleted + '%');
        }
      });
      console.log('上传成功:', response.data);
    } catch (error) {
      console.error('上传失败:', error);
    }
  }
}

多文件上传

如果需要支持多文件上传,可以修改前端和后端代码。

前端:

handleFileChange(event) {
  this.files = event.target.files;
},
uploadFiles() {
  const formData = new FormData();
  Array.from(this.files).forEach(file => {
    formData.append('files', file);
  });

  // 发送请求...
}

后端:

vue node实现文件上传

app.post('/upload', upload.array('files', 10), (req, res) => {
  // 处理多个文件
  const filesInfo = req.files.map(file => ({
    filename: file.filename,
    originalname: file.originalname
  }));
  res.json({ message: '文件上传成功', files: filesInfo });
});

安全性考虑

  1. 限制文件大小:
const upload = multer({
  storage: storage,
  limits: {
    fileSize: 5 * 1024 * 1024 // 5MB
  }
});
  1. 在服务器端验证文件类型,不要仅依赖前端验证。

  2. 考虑将上传的文件存储在非 Web 根目录下,通过专门的下载接口提供访问。

  3. 定期清理上传目录中的旧文件。

以上实现涵盖了从简单到进阶的文件上传功能,可以根据实际需求进行调整和扩展。

标签: 文件上传vue
分享给朋友:

相关文章

vue原型实现

vue原型实现

Vue 原型实现的关键点 Vue.js 的原型系统是其响应式机制的核心部分,通过原型链实现数据的动态绑定和依赖收集。以下是实现 Vue 原型的主要技术要点。 数据响应式原理 Vue 通过 Objec…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、Go…

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件:…

vue实现login

vue实现login

Vue 实现登录功能 在 Vue 中实现登录功能通常需要以下几个步骤: 创建登录表单组件 在 Vue 项目中创建一个登录表单组件,包含用户名和密码输入框以及提交按钮。可以使用 Vue 的模板语法和双…

vue实现爬虫

vue实现爬虫

Vue 实现爬虫的基本思路 Vue.js 本身是一个前端框架,主要用于构建用户界面。要实现爬虫功能,通常需要结合后端技术或浏览器自动化工具。以下是几种常见的方法: 方法一:Vue + Node.js…

vue前端实现

vue前端实现

Vue 前端实现基础步骤 安装 Vue.js 和相关依赖 通过 npm 或 yarn 安装 Vue.js,建议使用 Vue CLI 快速搭建项目。运行命令 npm install -g @vue/cl…