在我的java服务器上,我从iOS客户端获得一个InputStream,如下所示:
--0xKhTmLbOuNdArY
Content-Disposition: form-data; filename="Image001"
Content-Type: image/png
âPNG
IHDR���@���@���™iqfi���gAMA��Ø»7äÈ���tEXtSoftware�Adobe ImageReadyq…e<��IDATx⁄‰;iê]Uôflπ˜Ω◊Ø;ΩB::õY
ê6LÄ“Õ¿
... etc. ...
≠Yy<‘_˜øüYmc˚æØ…ægflóÏK$å±çe0ˆΩleIë¢êH¢Tñê–Üd
≠≤§àä6D¸>˙÷˜˚<øÁ˘˝˜˚º^sÁ=Áû{ÓπÁ‹œπ˜úÄÎ:!44¡@
--0xKhTmLbOuNdArY--
第一行和最后一行是我的HTTP边界。第2行和第3行是有关图像文件的信息。从第5行到倒数第二行,我需要一个图像文件作为字节数组。
那么如何将图像信息作为String获取,将图像文件作为InputStream中的字节数组? 解决方案应该快速有效(文件大小可以是几兆字节/ <10 MB)。
我的方法:
我将InputStream转换为String,然后将其拆分并将第二个String转换为byte array ...
String str = org.apache.commons.io.IOUtils.toString( inputStream );
String[] strArray1 = str.split( "\r\n\r\n", 2 );
byte[] bytes = strArray1[1].getBytes();
这种方式非常快,但字节数组似乎已损坏。我无法从该字节数组创建图像文件...某些字符被错误地转换。
也许有人可以提供帮助?
答案 0 :(得分:1)
您的代码中断的原因是第一行:
String str = org.apache.commons.io.IOUtils.toString( inputStream );
尝试将随机字节转换为Unicode字符,然后再转换回相同的随机字节,不会起作用。
你能做到这一点的唯一方法是分阶段阅读输入,而不是全部读入字符串。
IOUtils
)。答案 1 :(得分:1)
您可能不希望将bytes
转换为char
并返回,这会破坏您的字节,因为字节流与任何编码都不对应。
我会使用byte[]
以IOUtils.toByteArray
的形式阅读整个内容,然后在该数组中查找字节序列"\r\n\r\n".getBytes()
。
请注意,IOUtils.toByteArray
在流结束前不会停止。这应该适用于HTTP 1.0,但会破坏HTTP 1.1,它可以在同一个流上发送多个请求。在这种情况下,您必须逐步阅读以查找Content-Length
字段,以便了解要阅读的InputStream
的数量。