元素和 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 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Token…

vue实现缩放

vue实现缩放

Vue 实现缩放的方法 在 Vue 中实现缩放功能可以通过多种方式完成,以下是一些常见的方法: 使用 CSS transform 属性 通过 CSS 的 transform: scale() 属性可…

甘特图vue实现

甘特图vue实现

甘特图 Vue 实现方法 使用开源库 vue-ganttastic 安装依赖: npm install vue-ganttastic 基础实现代码: <template> <…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…

vue 实现图片

vue 实现图片

Vue 实现图片加载与展示的方法 在 Vue 中实现图片加载和展示可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind 绑定图片路径 通过 v-bind(或简写为 :)动态绑定图片的…

vue实现openoffice

vue实现openoffice

Vue 中集成 OpenOffice 的实现方法 在 Vue 项目中集成 OpenOffice 通常需要通过后端服务或现有库实现文档的预览和编辑功能。以下是几种常见的实现方式: 使用 OnlyOff…