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

Express.js如何获取FormData中上传的文件流及对应文件名

Express 原生不支持解析 multipart/form-data 类型的请求体(文件上传请求默认是该类型),需要借助第三方中间件实现,下面给出两种常用方案:

方案1:使用 multer(适合小文件场景,上手简单)

multer 是 Express 生态最常用的文件上传解析中间件,小文件场景下直接用内存存储即可快速实现需求。

  1. 安装依赖
npm install multer
  1. 完整接口实现
const express = require('express')
const multer = require('multer')
const { Readable } = require('stream')
const app = express()

// 配置multer使用内存存储,文件不会写入磁盘
const upload = multer({ storage: multer.memoryStorage() })

app.post('/uploadFiles', upload.any(), (req, res, next) => {
  // 解析获取文件名数组
  const filenames = req.body.files.split(',')
  // 匹配对应文件,转成可读流数组
  const streams = filenames.map(filename => {
    const targetFile = req.files.find(file => file.fieldname === filename)
    return Readable.from(targetFile.buffer)
  })

  // 后续业务逻辑处理
  res.json({ code: 0, msg: '上传完成' })
})

方案2:使用 busboy(适合大文件场景,流式处理更高效)

如果需要处理大文件,不想把整个文件加载到内存,可以用 busboy 直接监听文件流,边上传边处理,性能开销更低。

  1. 安装依赖
npm install busboy
  1. 完整接口实现
const express = require('express')
const Busboy = require('busboy')
const app = express()

app.post('/uploadFiles', (req, res, next) => {
  const filenames = []
  const streams = []
  const busboy = Busboy({ headers: req.headers })

  // 处理普通文本字段
  busboy.on('field', (fieldName, value) => {
    if (fieldName === 'files') {
      filenames.push(...value.split(','))
    }
  })

  // 直接获取上传的文件流,无需等待完整文件上传完成
  busboy.on('file', (fieldName, fileStream) => {
    streams.push(fileStream)
  })

  // 所有内容解析完成后的回调
  busboy.on('finish', () => {
    // 此处已经拿到完整的 filenames 和 streams 数组,可进行后续业务处理
    res.json({ code: 0, msg: '上传完成' })
  })

  // 将请求流导入busboy进行解析
  req.pipe(busboy)
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:03