元素和 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 中实现静态查询通常指不依赖后端接口,直接在前端处理数据筛选或搜索功能。以下是几种常见实现方式: 使用计算属性过滤数据 通过计算属性对静态数据进行筛选,适合简单查询…

vue实现适老化样式

vue实现适老化样式

Vue 实现适老化样式的关键方法 全局字体与字号调整 通过 CSS 变量或主题配置统一放大基础字号,建议正文不小于 18px,标题更大。在 App.vue 中设置全局样式: :root { -…

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在Vu…

vue实现分屏

vue实现分屏

Vue 实现分屏的方法 分屏功能通常用于展示多个独立内容区域,以下是几种常见的实现方式: 使用 CSS Grid 布局 通过 CSS Grid 可以轻松创建分屏布局,在 Vue 组件中直接应用样式…

vue实现弹窗

vue实现弹窗

Vue 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…