如何将Express.Multer.File类型的文件添加到FormData对象中
解决Express.Multer.File添加到FormData转发报错问题
错误原因
TypeError: source.on is not a function错误的核心原因是:Express.Multer.File是Multer解析上传后生成的内存对象,默认包含文件buffer、元信息,但不是FormData库要求的可读流/本地文件实例,直接传入append方法会导致底层流处理逻辑失效。
正确实现步骤
方法1:直接传入buffer+手动指定文件元信息(最常用)
无需额外转换,直接使用Multer返回的buffer属性搭配元信息即可:
import FormData from 'form-data'; // 假设你接收到的Multer文件对象变量名为uploadedFile const form = new FormData(); form.append( 'randomword', // 对应目标接口的文件字段名 uploadedFile.buffer, // 直接传入Multer返回的文件buffer { filename: uploadedFile.originalname, // 原始文件名 contentType: uploadedFile.mimetype // 文件MIME类型 } );
方法2:转换为可读流后传入
如果你的场景需要用流的方式处理,可以先将buffer转为Node可读流再传入:
import { Readable } from 'stream'; import FormData from 'form-data'; const form = new FormData(); const fileStream = Readable.from(uploadedFile.buffer); form.append('randomword', fileStream, { filename: uploadedFile.originalname, contentType: uploadedFile.mimetype });
注意事项
- 不要直接传完整
Express.Multer.File对象到append方法,必须明确传入buffer属性或转成可读流的结果 - 第三个参数的文件名、MIME类型建议必填,否则目标API可能无法正常识别文件格式
- 若使用Axios等请求库发送FormData,需要手动将
form.getHeaders()的返回值合并到请求头中,避免边界符缺失导致的解析失败,示例:
import axios from 'axios'; const response = await axios.post('目标接口地址', form, { headers: { ...form.getHeaders() } });
内容的提问来源于stack exchange,提问作者Pandorque
相关产品推荐
相关产品推荐

