CommonsMultipartResolver破坏二进制编码

3

我正在尝试保存一个通过 multipart/mixed HTTP 请求上传的二进制文件,它作为一个 @RequestPart ByteArrayResource 到达我的控制器,但是当我使用 FileOutputStream.write 将字节数组保存到磁盘时,与原始文件中的字节不同。

由于与 ASCII 字符对应的字节相同,不同的是具有更高值的字节,因此我认为这是一个字符编码的问题,但设置

<property name="defaultEncoding" value="utf-8"/>

对于CommonsMultipartResolver无法解决该问题。

请求部分还具有Content-Transfer-Encoding: binary,但似乎Commons的多部分解析器正在注入与客户端发送的不完全相同的ByteArrayResource字节。

我漏掉了什么?


你的部分是否指定了 Content-Type: application/octet-stream - Pavel Horal
是的。最终我通过绕过CommonsMultipartResolver解决了这个问题,将整个HttpServletRequest传递给我的控制器方法并在其中解析部分,但我仍然不明白为什么解析器会更改请求中的编码以及如何保留它。 - Raibaz
如果你有application/octet-stream存在,但从未像使用字符流(Reader / Writer)一样处理它,那么这是一个严重的错误。Commons-multipart是一个广泛使用的库,如果它包含这样的错误,那就很奇怪了。你确定你正在使用commons-multipart吗?我知道例如Tomcat在Servlet 3多部分支持方面存在一些问题。如果你的配置不正确,以至于commons-multipart实际上没有被使用,那可能就是问题所在。 - Pavel Horal
据我所知,Spring默认使用它,并且我没有更改过它的配置,但是你说得对,我没有详细检查以确保Commons-multipart是问题的原因。 - Raibaz
1个回答

0
最终,我通过手动解析请求部分来解决它:
FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

List<FileItem> items = upload.parseRequest(request);            
for(FileItem item : items) {                     
switch(item.getFieldName()) {
       //Do something with each of the single parts
    }
}

虽然不是最干净的方法,但至少我让它工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接