1

在我的 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 行到倒数第二行,有我需要的图像文件作为字节数组。

那么如何从 InputStream 中获取字符串形式的图像信息和字节数组形式的图像文件呢? 解决方案应该快速高效(文件大小可以是几兆字节/< 10 MB)。

我的做法:

我将 InputStream 转换为字符串,然后将其拆分并将第二个字符串转换为字节数组...

String str = org.apache.commons.io.IOUtils.toString( inputStream );
String[] strArray1 = str.split( "\r\n\r\n", 2 );
byte[] bytes = strArray1[1].getBytes();

这种方式非常快,但是字节数组似乎损坏了。我无法从该字节数组创建图像文件...某些字符转换不正确。

也许有人可以帮忙?

4

2 回答 2

1

您的代码中断的原因是第一行:

String str = org.apache.commons.io.IOUtils.toString( inputStream );

尝试将随机字节转换为 Unicode 字符,然后再转换回相同的随机字节,是行不通的。

完成这项工作的唯一方法是分阶段读取输入,而不是将其全部读入字符串。

  1. 从 InputStream 中读取,直到您确信您已超过 HTTP 边界线。
  2. 将流的其余部分读入一个字节数组(您也可以使用IOUtils它)。
于 2012-10-05T00:14:38.407 回答
1

您可能不想将您的转换byteschar和转换回来,这会破坏您的字节,因为字节流不对应于任何编码。

我会将整个内容作为byte[]using读取,然后在该数组中IOUtils.toByteArray查找字节序列。"\r\n\r\n".getBytes()

请注意,IOUtils.toByteArray直到流结束才停止。这对于 HTTP 1.0 应该没问题,但对于可以在同一流上发送多个请求的 HTTP 1.1 会中断。在这种情况下,您必须逐步阅读才能找到该Content-Length字段,以便知道要阅读多少InputStream内容。

于 2012-10-05T00:18:48.070 回答