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

Express服务器无法获取客户端上传文件问题求助

问题:Express + Multer 文件上传后req.files为undefined,且文件无扩展名

客户端Pug代码

doctype html
html
    head
        title Test
    body
        form(action=`${baseRoute}/api/users/${nick}/generate` enctype="multipart/form-data" method='POST')
            input(type='file' accept="image/png, image/jpeg" id='profile_picture' name='image')
            input(type='submit', value='Load')

后端Express初始代码

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

app.set('views', 'views');
app.set('view engine', 'pug');

app.get('/', function(req, res, next) {
  res.redirect('/test/update_user');
});

app.post('/api/users/:nick/generate', upload.single('image'), async function(req, res, next) {
  console.log("GENERATE USER");
  console.log(req.files);
  res.send("Success");
});

app.get('/test/update_user', function(req, res, next) {
  let params = {
    baseRoute: "",
    nick: 'somenick',
  };
  res.render('test/update_user', params);
});

app.listen(3000, () => {
  console.log("go to localhost:3000/test/update_user");
});

问题原因与修复方案

1. req.files 输出undefined的解决

使用upload.single('image')处理单个文件上传时,multer会将文件信息存入**req.file(单数)**,req.files仅适用于多文件上传场景(如upload.array()或upload.fields())。

修复:将代码中的console.log(req.files)替换为console.log(req.file),即可获取单个文件的完整信息(包括原文件名、存储路径、文件大小等)。

2. 上传文件无扩展名的解决

multer默认存储配置不会保留原文件扩展名,需自定义存储引擎来添加扩展名:

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

// 自定义存储规则
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/'); // 指定文件保存目录
  },
  filename: (req, file, cb) => {
    // 生成唯一文件名:时间戳+随机数+原文件扩展名
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, uniqueSuffix + path.extname(file.originalname));
  }
});

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

完整修复后的后端代码

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

// 自定义multer存储配置
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/');
  },
  filename: (req, file, cb) => {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, uniqueSuffix + path.extname(file.originalname));
  }
});

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

app.set('views', 'views');
app.set('view engine', 'pug');

app.get('/', function(req, res, next) {
  res.redirect('/test/update_user');
});

app.post('/api/users/:nick/generate', upload.single('image'), async function(req, res, next) {
  console.log("GENERATE USER");
  console.log(req.file); // 改为req.file获取单个文件信息
  res.send("Success");
});

app.get('/test/update_user', function(req, res, next) {
  let params = {
    baseRoute: "",
    nick: 'somenick',
  };
  res.render('test/update_user', params);
});

app.listen(3000, () => {
  console.log("go to localhost:3000/test/update_user");
});

内容的提问来源于stack exchange,提问作者Efim Rubin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:17:00