Java HttpServletRequest输入流损坏?

Java HttpServletRequest输入流损坏?,java,servlets,soap,mime,mms,Java,Servlets,Soap,Mime,Mms,我通过一个Javaservlet接收到一条SOAPMessage,其中的attachmentpart包含一个多部分mime。这样做: InputStream inputStream = request.getInputStream(); byte[] data = IOUtils.toByteArray(inputStream); File file = new File("/usr/local/user/message.txt"); FileOutputStre

我通过一个Javaservlet接收到一条SOAPMessage,其中的attachmentpart包含一个多部分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();

为多部分mime中的二进制代码提供损坏的数据。有人知道为什么会这样吗?我将二进制数据复制到一个文件中,并将文件扩展名更改为相应的图像扩展名,但得到的图像已损坏。通过比较message.txt和.snoop文件的十六进制数据,可以看出导致失真的十六进制数据存在细微差异。ASCII数据没有变化。谢谢


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

对于多部分MIME,您可以使用Apache文件上载库。你可以在这里找到它:


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

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

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


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

“比较message.txt和.snoop文件的十六进制数据表明,导致失真的十六进制数据略有不同。”。你能进一步阐述这些扭曲吗。另外,如果您有网络嗅探/捕获功能,是否可以使用客户端发送的内容编码头更新问题?内容编码未发送,因此假设它是二进制的。失真如中所示,图片一开始看起来是正确的,但过了一段时间后,它开始看起来很奇怪,因为十六进制值是错误的。例如:06 04 04 04 04 04 04 06 04 04 04 04 04 04 04 04 06 04 04 04 04 04 04 04 04 04 06 04 04 06 0D在我执行上述操作后变为06 04 04 04 04 04 04 04 04 04 04 06 0D。0a是LF,0D是CR。我认为这是unix与windows行结尾的问题。发生的是我正在将文件写入Linux系统。我使用WINSCP将文件复制到windows计算机上以查看它。这会导致数据发生变化吗?不仅仅是0A和0D,还有一些其他数据也会发生变化,然后它们在一段时间内看起来还是一样的。很可能(假设您最初将文件命名为
.txt
)。在WinSCP站点中读取。编辑:使用二进制模式进行传输,看看是否有差异。你读过问题了吗?OP指的是在服务器端解析请求时的差异,而不是如何解析请求。此外,多部分post使用base64编码,而不是二进制附件。