Multer默认不支持XML文件上传,需显式配置fileFilter允许application/xml、text/xml等MIME类型,并使用uploadXml.single('xml')匹配前端name属性,XML内容在req.file.buffer中而非req.body。

Node.js中Multer默认不支持XML文件上传
Multer默认只解析 multipart/form-data 类型的请求,且仅对 Content-Type 为 text/plain、text/csv、application/json 等常见类型做自动字段解析;XML 文件(application/xml 或 text/xml)不会被自动解析为 req.body,也不会被 multer().single() 拦截处理——它会被直接忽略或报错 Unexpected field。
必须显式配置 fileFilter 允许XML MIME类型
否则 Multer 会拒绝非图片/文档类扩展名的上传。关键点是:XML 文件常以 .xml 结尾,但服务端不能只靠扩展名判断,必须检查 file.mimetype。
-
fileFilter函数必须返回true才允许该文件进入内存或磁盘 - 常见合法 XML MIME 类型包括:
application/xml、text/xml、application/x-xml - 不要只校验
path.extname(file.originalname) === '.xml',浏览器可能不带扩展名或伪造
const multer = require('multer');
const xmlStorage = multer.memoryStorage(); // 推荐用 memoryStorage,便于后续解析字符串
const uploadXml = multer({
storage: xmlStorage,
fileFilter: (req, file, cb) => {
if (
file.mimetype === 'application/xml' ||
file.mimetype === 'text/xml' ||
file.mimetype === 'application/x-xml'
) {
cb(null, true);
} else {
cb(new Error('Only XML files are allowed'));
}
},
limits: {
fileSize: 5 1024 1024 // 限制5MB以内,防爆内存
}
});
使用 uploadXml.single('xml') 时字段名必须匹配前端
XML 文件在表单中通常作为单个文件上传,后端需指定字段名(如 xml),与前端 HTML 的 name 属性一致。若不一致,Multer 会报 Unexpected field 错误。
- 前端示例:
- 后端路由中必须用
uploadXml.single('xml'),不是'file'或'data' - 成功后,文件内容在
req.file.buffer(memoryStorage下)或req.file.path(diskStorage下) - 记得用
xml2js、fast-xml-parser等库进一步解析req.file.buffer.toString()
注意 req.body 里不会有XML内容,所有数据都在 req.file
Multer 不会把 XML 文件内容塞进 req.body,哪怕你用 uploadXml.none() 也不行——它只处理 multipart 中的文件部分。如果前端还提交了其他表单字段(如 ),它们会出现在 req.body.id,但 XML 本身只在 req.file。
- 别写
console.log(req.body)期待看到 XML 字符串 - 正确读取方式:
const xmlStr = req.file.buffer.toString('utf8'); - 若用
diskStorage,需先fs.readFileSync(req.file.path, 'utf8') - 务必校验
req.file是否存在,避免Cannot read property 'buffer' of undefined
XML 解析逻辑和错误处理容易被跳过,尤其当上传大文件或格式非法时,req.file.buffer 可能为空或乱码——建议在调用 fast-xml-parser.parse() 前加 try/catch 并检查 req.file.buffer.length。










