Express.js如何获取FormData中上传的文件流及对应文件名
Express 原生不支持解析 multipart/form-data 类型的请求体(文件上传请求默认是该类型),需要借助第三方中间件实现,下面给出两种常用方案:
方案1:使用 multer(适合小文件场景,上手简单)
multer 是 Express 生态最常用的文件上传解析中间件,小文件场景下直接用内存存储即可快速实现需求。
- 安装依赖
npm install multer
- 完整接口实现
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 直接监听文件流,边上传边处理,性能开销更低。
- 安装依赖
npm install busboy
- 完整接口实现
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
相关产品推荐
相关产品推荐

