2016-11-21 20 views
0

私は、HTTPポストリクエストを介して.pngイメージをクライアントに送信しています。 .pngはsqlite3データベース内に格納され、blobとして取得され、これはすべて正常に動作します。返されたBLOBをディスクに保存してテストしたところ、期待どおりに開くことができます。私のクライアントがレスポンスを解釈すると、ペイロードの長さは16365から16367に伸びています。応答文字列を調べると、いくつかの余分な '?'HTTP経由でバイナリデータを受信

// request 
URL url = new URL(targetURL); 
conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestMethod("POST"); 
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
conn.setRequestProperty("Content-Length", Integer.toString(parameters.getBytes().length)); 
conn.setRequestProperty("Content-Language", "en-US"); 
conn.setUseCaches(false); 
conn.setDoOutput(true); 
conn.getOutputStream().write(parameters.getBytes()); 

// response 
Reader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
StringBuilder sb = new StringBuilder(); 
for (int c; (c = rd.read()) >=0;) 
    sb.append((char)c); 
String response = sb.toString(); 
// this String is of length 16367 when it should be 16365 
:プラグインのChrome ARCを使用してサーバをテストストリーム

で断続的に文字が応答が受信、私は私のクライアントのコードに問題があると信じてつながる右の長さ、であることが示されています

ここで間違っているものは何か飛び出していますか?注記生の画像データを使用するときは、どちらの側でも文字エンコーディングを行っていませんか?

+0

どこでも同じエンコードを使用していますか(DBのblobエンコードを含む)ですか?一見するとエンコードの問題のように聞こえます... – Filip

+0

@Filipは、エンコードの問題のように見えます。バイナリストリームをPNGイメージの場合は文字列として解釈するのはなぜですか? – cjungel

+0

私はエンコーディングのチェックを絶対にしていません。 DBブロブは仕様通りのバイトであると思われますが、私はサーバとクライアントを同じエンコーディングを使用するように変更して何が起こるかを見てみます。 – Madden

答えて

0

DataInputStreamを使用すると、バイトストリームを読み取ることができます。

URL url = new URL("http://i.stack.imgur.com/ILTQq.png"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

DataInputStream dis = new DataInputStream(conn.getInputStream()); 

FileOutputStream fw = new FileOutputStream(new File("/tmp/img.png")); 

byte buffer[] = new byte[1024]; 

int offset = 0; 
int bytes; 
while ((bytes = dis.read(buffer, offset, buffer.length)) > 0) { 
    fw.write(buffer, 0, bytes); 
} 
fw.close(); 

あるいはBufferedImageのインスタンスはImageIO.read(java.net.URL)を用いURLから直接作成することができます。

URL url = new URL("http://i.stack.imgur.com/ILTQq.png"); 
BufferedImage image = ImageIO.read(url); 
+0

です。実際には非常に便利だと思いますが、ファイルではなくBufferedImageオブジェクトにどのように書き込むのか分かりますか? – Madden

+0

@Madden私はこれを含める答えを編集しました。 – cjungel

+0

ImageIO.read()ブロックはありますか?この関数は常にnullを返すので、呼び出しがバッファに残っている直後にconn.getInputStream()で使用可能なバイトをチェックします。 – Madden

関連する問題