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行目から最後から2番目の行まで、バイト配列として必要な画像ファイルがあります。

では、画像情報を文字列として取得し、画像ファイルを InputStream からバイト配列として取得するにはどうすればよいでしょうか? ソリューションは高速かつ効率的である必要があります (ファイル サイズは数メガバイト / < 10 MB になる可能性があります)。

私のアプローチ:

InputStream を文字列に変換してから分割し、2 番目の文字列をバイト配列に変換します...

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. HTTP 境界線を超えたと確信できるまで、InputStream から読み取ります。
  2. 残りのストリームをバイト配列に読み込みます (これにも使用できますIOUtils)。
于 2012-10-05T00:14:38.407 に答える
1

バイトストリームはどのエンコーディングにも対応していないため、バイトを破壊する可能性がありbytesます。char

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 に答える