HttpServletRequest InputStream损坏了吗?

时间:2011-06-17 09:31:11

标签: java servlets soap mime mms

我在java servlet上收到一个SOAPMessage,其附件包含一个multipart mime。这样做:

 InputStream inputStream = request.getInputStream();           
 byte[] data = IOUtils.toByteArray(inputStream);

 File file = new File("/usr/local/user/message.txt");
 FileOutputStream fos = new FileOutputStream(file);
 fos.write(data);
 fos.close();

为我提供了multipart mime中二进制代码的损坏数据。谁知道为什么会这样?我将二进制数据复制到一个文件,并将文件扩展名更改为相应的图像扩展名,但我的图像已损坏。比较message.txt和.snoop文件的十六进制数据表明,导致失真的十六进制数据存在细微差别。 ASCII数据没有变化。感谢。

存在失真,因为你可以看到图片在开始时看起来是正确的,但是一段时间之后开始看起来很奇怪,因为十六进制值是错误的。例如:06 04 04 04 04 04 06 04 04 06 0a从客户端变为06 04 04 04 04 04 06 04 04 06 0D我做了以上操作。

2 个答案:

答案 0 :(得分:1)

根据评论,似乎文件正确写入磁盘(这是我的解释)。

WinSCP用于将文件从(Linux / Unix)计算机传输到Windows计算机。传输过程中使用的传输模式可能导致WinSCP将所有unix样式的行结尾转换为Windows样式的行结尾,反之亦然,具体取决于转移源自何处。当使用文本模式传输文件时,或者允许WinSCP确定是否应使用文本或二进制模式传输文件时,会发生这种情况。您可能已将其设置为默认模式,因此强制文件以二进制形式传输;如果这不起作用,你需要进一步调查。

如果WinSCP似乎是导致此问题的原因,您可以通过查看两个平台上文件的二进制内容来确认。您可以使用xxd on Linux/Unix。在Windows上,this question中列出的其中一个实用程序会有所帮助。

您也可以使用任何其他文件复制协议,如FTP,SFTP,甚至使用NFS或Samba传输文件,并建立WinSCP作为原因。

答案 1 :(得分:0)

对于multipart MIME,您可以使用Apache Fileupload库。你可以在这里找到它:

Apache Fileupload download path

Starter tutorial