You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express(NodeJS)文件上传问题:req.files始终为undefined求助

解决Express中req.files返回undefined的问题

嗨,这个问题我之前踩过一模一样的坑!核心原因是Express默认不支持解析文件上传需要的multipart/form-data类型请求,你得借助专门的中间件来处理,最常用的就是multer库,下面一步步帮你解决:

步骤1:安装multer依赖

首先在项目里安装multer:

npm install multer
# 或者用yarn
yarn add multer

步骤2:修改你的代码

更新后的代码会引入multer并配置上传逻辑,我给你两种常用的配置方案:

方案1:文件临时存在内存中(适合读取文件内容后直接处理)

import express from 'express';
import multer from 'multer';

let app = express();
// 创建multer实例,使用内存存储模式
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

// 在post路由中挂载upload中间件,single('file')表示接收名为`file`的单个文件
app.post('/', upload.single('file'), function(req, res) {
  // 现在req.file会包含上传文件的所有信息
  console.log(req.file);
  res.send(req.file);
})

app.listen(process.env.PORT || 8000, () => {
  console.log(`Started on port 8000`);
});

export default app;

方案2:将文件保存到服务器磁盘

如果需要把文件持久化存储到服务器,可以这样配置:

import express from 'express';
import multer from 'multer';
import path from 'path';
import fs from 'fs';

let app = express();
// 确保uploads目录存在,避免存储时报错
const uploadDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadDir)) {
  fs.mkdirSync(uploadDir);
}

// 配置磁盘存储的路径和文件名规则
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, uploadDir);
  },
  filename: function (req, file, cb) {
    // 自定义文件名,这里保留原文件名+时间戳避免重复
    cb(null, `${Date.now()}-${file.originalname}`);
  }
});
const upload = multer({ storage: storage });

app.post('/', upload.single('file'), function(req, res) {
  console.log(req.file); // 包含文件存储路径、大小、类型等信息
  res.send(`文件已上传至:${req.file.path}`);
})

app.listen(process.env.PORT || 8000, () => {
  console.log(`Started on port 8000`);
});

export default app;

步骤3:检查Postman的请求配置

确保你在Postman里的设置完全正确:

  • 请求方法选择POST
  • 请求Body切换为form-data模式
  • 添加一个键,把键的类型从Text改成File
  • 键名必须和代码里upload.single('xxx')中的xxx一致(比如上面代码里是file,那键名就填file)
  • 选择要上传的文件,然后发送请求

为什么原来的代码不行?

Express内置的express.json()和express.urlencoded()中间件,只能解析JSON格式和URL编码的表单数据,完全不处理multipart/form-data类型的请求——而文件上传正好依赖这个请求类型,所以你的req.files才会一直是undefined,必须用multer这类中间件来专门解析。

内容的提问来源于stack exchange,提问作者Trishant Pahwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:26:07