カメラから戻ってきたjpeg画像バッファをアップロードしようとしています。長さはわかっていますが、その長さだけをsetFixedLengthStreamingMode()ルーチンに渡すと、logcatでエラーが発生し、異なるサイズが予想されることが示されます。これがAndroidのバグであるか(このデバイスで2.3.3を実行している)、POSTデータに加えてヘッダーのサイズを追加することになっているのかどうかはわかりません。setChunkedStreamingMode(0)を使用でき、それは正常に機能しますが、データをコピーするオーバーヘッドを回避するのがよいと考えていました。155バイトを任意に追加する場合を除いて、常に155バイト離れているように見えます。そうすると、2バイトずれていることがわかります:-)。
1 に答える
デフォルトでは、クライアントのメモリに書き込まれるすべてのものが閉じられるまでURLConnection
バッファリングされます。HTTP応答ヘッダーを設定する必要があるため、これは必須です。ただし、コンテンツの長さは、すべてのバイトが書き込まれた後でのみわかります。これは、応答本体が比較的大きい場合にメモリを占有している可能性があります。getOutputStream()
Content-Length
書き込まれる正確なバイト数(注:文字ではなくバイト)が事前にわかっている場合は、正確にsetFixedLengthStreamingMode()
そのバイト数で設定することで、ヘッダーをより早く設定でき、より頻繁にフラッシュできるようになります。 。あなたの特定のケースでは、明らかに間違った値を使用しました。Content-Length
URLConnection
setChunkedStreamingMode()
基本的に、転送エンコーディングをに変更しますchunked
。これは基本的に、バイト長が16進コードの1行で、その後に1行の書き込みバイトが続き、その後に空白行が続きます(wikipediaも参照)。最後の行のバイト長は0であるため、サーバーはそれが本文の終わりであることを認識しているため、着信データを待つ必要はありません。これにより、応答本体をより頻繁にフラッシュできます。0だけでなく、1000などの適切な値を設定する必要があります。このようにして、書き込まれた1000バイトごとに新しいチャンクとして送信されます。