如何正确将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
相关产品推荐
相关产品推荐

