我在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我做了以上操作。
答案 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库。你可以在这里找到它: