2011-06-17 162 views
2

我收到一个带有包含多部分MIME的附件的java servlet上的SOAPMessage。这样做:HttpServletRequest InputStream是否损坏?

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我完成上述操作后。

+0

“比较message.txt和.snoop文件的十六进制数据表明,导致失真的十六进制数据存在细微差异”。你能扩展这些扭曲吗?另外,如果您有网络侦听/捕获,您是否可以使用客户端发送的Content-Encoding头更新问题? – 2011-06-17 09:37:09

+0

内容编码没有发送,所以假设它是二进制的。如您所看到的失真可以看到图片在开始时看起来是正确的,但由于十六进制值是错误的,它在一段时间后开始显得很奇怪。例如:06 04 04 04 04 04 06 04 04 06 0a从客户端变成06 04 04 04 04 04 06 04 04 06 0D我完成上述操作后。 – Maurice 2011-06-17 09:46:58

+1

0A是LF,0D是CR。我认为这是unix vs windows行尾的问题。 – 2011-06-17 09:52:54

回答

1

根据该意见,看来该文件被写入到磁盘正确(这是我的解释)。

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

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

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

0

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

Apache Fileupload download path

Starter tutorial

+0

你看过这个问题吗? OP指的是在解析服务器端的请求时出现差异,而不是如何解析请求。此外,多部分帖子使用base64编码,而不是二进制附件。 – 2011-06-17 09:49:01