MalformedStreamException 异常与 multipart/form-data 边界机制
org.apache.tomcat.util.http.fileupload.MultipartStream$MalformedStreamException 是 Tomcat 在处理文件上传时抛出的一个异常,通常表示接收到的文件数据格式不符合规范,导致无法正确解析。
一、错误原因分析
1. 数据截断
上传过程中网络中断、用户取消或服务器超时可能导致文件未完整传输。Tomcat 在读取流时未能找到预期的结束分隔符,从而抛出异常。
2. 格式错误
HTTP 文件上传需遵循 multipart/form-data 协议。如果请求头缺少 Content-Type: multipart/form-data 或分隔符(boundary)定义不正确,服务器无法拆解数据。
3. 换行符不规范
RFC 2046 规范要求 multipart/form-data 的边界前后必须使用 CRLF (\r\n) 作为换行符。若仅使用 LF (\n),解析器可能无法识别边界。
4. 正则匹配问题
在手动处理边界字符串时,正则表达式若未正确提取 boundary 值(例如包含了前导短横线),会导致后续解析失败。
二、multipart/form-data 边界机制
1. 边界的作用
边界(boundary)是用于分隔表单中多个不同部分(如文本字段、文件上传)的特殊字符串。它确保接收方能准确识别每个部分的起始和结束位置。
2. 边界规范
- 格式:以两个短横线
--开头,后跟唯一字符串。 - 声明:在
Content-Type头中指定,例如:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
- 换行符:边界前后必须使用
\r\n。 - 结束标记:最后一个边界需以
--结尾(如--boundary--)。
3. WebKitFormBoundary 与纯数字边界
- WebKitFormBoundary:浏览器(Chrome/Safari)自动生成,通常带有
WebKitFormBoundary前缀,便于调试。 - 纯数字边界:手动构造或使用工具生成,通常为随机数字组合(如
---------------------------149742642616556)。 - 等价性:两者功能完全等价,只要符合
--<唯一字符串>格式且与 Content-Type 声明一致即可。
三、解决方案
1. 检查客户端代码
确保表单包含 enctype="multipart/form-data",API 调用时设置正确的 Content-Type 请求头。
HTML 示例:
上传
