元素和 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 和其上传进度事件。

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);
  });

  // 发送请求...
}

后端:

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 node实现文件上传

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

相关文章

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓…

vue实现多用户登录

vue实现多用户登录

实现多用户登录的基本思路 在Vue中实现多用户登录通常需要结合后端API完成身份验证,并通过前端路由、状态管理(如Vuex或Pinia)和本地存储(如localStorage)来管理用户会话。以下是关…

vue实现a

vue实现a

Vue 实现 A 功能的方法 在 Vue 中实现 A 功能可以通过多种方式,具体取决于 A 功能的具体需求。以下是几种常见的实现方法: 使用 Vue 组件 通过创建自定义组件来实现 A 功能。组件…

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click…

vue实现https

vue实现https

Vue 中实现 HTTPS 的步骤 在 Vue 项目中实现 HTTPS 主要涉及开发环境配置和生产环境部署。以下是具体方法: 开发环境配置(Vue CLI 或 Vite) 使用 mkcert…

vue实现选区

vue实现选区

Vue 实现选区的基本方法 在Vue中实现选区功能通常涉及DOM操作和事件处理。以下是几种常见的方法: 使用原生JavaScript的Selection API 通过window.getSelec…