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

如何正确将NodeJS Buffer以form-data发送至Spring Boot 解决MultipartFile读取为null问题

问题根因定位

核心问题出在不必要的base64转换步骤上:

  • NodeJS端将原始图片Buffer转换为base64字符串后追加到FormData中,formData.append接收到字符串类型的值时,会将其作为普通文本表单字段处理,不会把内容识别为文件二进制流
  • 此时Spring Boot侧接收到的MultipartFile内容,本质是base64编码后的纯文本,不是符合JPG/PNG格式规范的图片二进制数据,ImageIO.read()因为无法识别这段文本流的图片格式,自然会返回null
  • 这也是为什么Postman选择本地真实文件构造multipart请求时接口可以正常运行——Postman上传的是真实文件二进制流,和Node端传base64字符串的请求体结构完全不同
可正常运行的实现方案

直接跳过base64转换步骤,将原始图片Buffer直接追加到FormData即可,参考代码如下:

// 直接使用原始图片Buffer,不要做base64字符串转换
const qrCodeBuffer = Buffer.from(body);
formData.append('qrCode', qrCodeBuffer, {
  filename: 'qrCode.jpg',
  contentType: 'image/jpeg' // 显式声明文件MIME类型,避免元信息识别异常
});
axios({
    method: "post",
    url: `${SERVER_URL}${TICKET_VALIDATION}`,
    data: formData,
    headers: formData.getHeaders(),
})
    .then((res)=>console.log(res))
    .catch((err)=>console.error('请求异常', err))
关键注意事项
  • 不要对原始图片Buffer执行.toString('base64')操作:一旦将Buffer转为字符串,FormData会自动将其归类为普通文本字段,失去文件上传的二进制属性
  • 记住FormData.append的参数规则:第二个参数传入字符串时,对应表单字段是普通文本类型;只有传入Buffer/Blob/文件流等二进制类型时,才会按照文件上传的规则封装请求体
  • 追加文件时建议显式配置filename和contentType,避免FormData自动推断的元信息和实际图片格式不匹配,导致Spring侧的MultipartFile解析异常

快速校验发送内容正确性的方法:正常上传JPG格式二维码时,Buffer的内容长度一般在几KB到十几KB,且为二进制流;如果是错误传base64字符串的场景,字段长度会比原始Buffer长33%左右,且内容为可打印的base64字符,两者差异非常明显

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 10:57:04