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

不使用Multer时,如何在Express中获取req.file?

问题分析与解决方案

核心原因

express自带的express.urlencoded和express.json中间件仅支持解析application/x-www-form-urlencoded和application/json类型的请求,完全不处理multipart/form-data格式——这正是你用form-data提交文件时的请求类型,所以这两个中间件不会解析请求中的文件部分,自然req.file和req.files都是undefined。

关于Content-Type

不需要修改Content-Type,multipart/form-data是上传文件的标准且正确的请求类型。

解决方案:手动解析multipart请求

不用Multer的话,你需要借助轻量的multipart解析库(比如busboy)来处理请求流,直接获取文件流或缓冲区,再传给Cloudinary的upload_stream。

步骤1:安装依赖

npm install busboy cloudinary

步骤2:示例代码(直接传文件流到Cloudinary,更高效)

const express = require('express');
const Busboy = require('busboy');
const cloudinary = require('cloudinary').v2;

// 配置Cloudinary(替换为你的实际配置)
cloudinary.config({
  cloud_name: '你的cloud_name',
  api_key: '你的api_key',
  api_secret: '你的api_secret'
});

const app = express();

app.post('/api/upload/images', (req, res) => {
  const busboy = new Busboy({ headers: req.headers });

  // 监听文件字段
  busboy.on('file', (fieldname, fileStream, filename, encoding, mimetype) => {
    // 直接将文件流管道到Cloudinary的上传流
    const cloudinaryStream = cloudinary.uploader.upload_stream(
      { resource_type: 'image' },
      (err, result) => {
        if (err) return res.status(500).json({ error: err.message });
        res.json({ uploadUrl: result.secure_url });
      }
    );
    fileStream.pipe(cloudinaryStream);

    fileStream.on('end', () => {
      console.log(`文件 ${filename} 流传输完成`);
    });
  });

  busboy.on('finish', () => {
    console.log('请求解析完成');
  });

  // 将请求流交给Busboy处理
  req.pipe(busboy);
});

app.listen(3000, () => {
  console.log('服务运行在 http://localhost:3000');
});

若需先获取文件缓冲区再上传

如果你需要先对文件做处理(比如校验、修改),可以先将文件数据攒成Buffer,再传给Cloudinary:

busboy.on('file', (fieldname, fileStream, filename, encoding, mimetype) => {
  const bufferChunks = [];
  
  fileStream.on('data', chunk => bufferChunks.push(chunk));
  fileStream.on('end', () => {
    const fileBuffer = Buffer.concat(bufferChunks);
    
    // 用缓冲区上传到Cloudinary
    cloudinary.uploader.upload_stream(
      { resource_type: 'image' },
      (err, result) => {
        if (err) return res.status(500).json({ error: err.message });
        res.json({ uploadUrl: result.secure_url });
      }
    ).end(fileBuffer);
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:27:37