Spring MMS接收API获取图片/GIF文件Part内容为空问题求助
问题背景
开发Spring REST API接收MMS时,调用MultipartHttpServletRequest.getParts()获取图片/GIF对应的Part时,size显示为0,但3GP视频、文本文件正常;Filter已确认请求体包含图片的base64内容。
排查与修复步骤
1. 修复Filter的请求流耗尽问题
你的Filter直接读取了HttpServletRequest.getInputStream(),而Servlet请求流是一次性的——流被读取后,后续Spring的Multipart解析器无法再获取内容,导致二进制Part解析失败(文本/视频因解析逻辑差异未表现出问题)。
解决代码:使用ContentCachingRequestWrapper包装请求,实现流的重复读取:
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(httpRequest); // 先让后续处理流程执行,再读取缓存的请求体 filterChain.doFilter(wrappedRequest, servletResponse); String requestBody = new String(wrappedRequest.getContentAsByteArray(), StandardCharsets.UTF_8); LOGGER.info("Request Body: {}", requestBody); }
2. 检查Multipart大小限制配置
如果图片大小超过Spring Multipart配置的阈值,会被截断导致size为0。检查并调整配置:
# application.yml 示例 spring: servlet: multipart: max-file-size: 10MB # 单个文件最大容量 max-request-size: 20MB # 整个请求总容量 enabled: true
3. 处理Base64编码的Part
若请求中图片Part的Content-Transfer-Encoding为base64,Spring默认解析器无法自动解码,会导致读取到空内容。此时需要手动解码:
private byte[] getDecodedPartContent(Part part) throws IOException { try (InputStream inputStream = part.getInputStream()) { byte[] encodedBytes = IOUtils.toByteArray(inputStream); return Base64.getDecoder().decode(encodedBytes); } }
同时检查请求体的Part header,确认是否存在Content-Transfer-Encoding: base64标识。
4. 验证Part名称匹配逻辑
日志中图片Part的contentType包含name=709055746.jpg,这里的name是文件名,而非Part的参数名称。需要确认请求体中Part的Content-Disposition头是否为:
Content-Disposition: form-data; name="mmsContent"; filename="709055746.jpg"
如果name字段不是mmsContent,你的过滤逻辑会错误匹配到空Part,导致size显示为0。
内容的提问来源于stack exchange,提问作者Mudabbir Pasha

