2

InputStreamから取得したデータをPOSTしようとしています。最初にすべてのデータをバイト配列に収集する必要がなく、代わりにデータをストリーミングしてメモリを節約したいと思っていました(約10MBのデータをPOSTしています)。

私が以下を実行した場合:

DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(target_url);
MultipartEntity entity = new MultipartEntity();
entity.addPart("data", new InputStreamBody(new ByteArrayInputStream(new byte[1]), 
    filename));
httpPost.setEntity(entity);
httpclient.execute(httpPost);

それから私は得る:

org.apache.http.NoHttpResponseException: The target server failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:95)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
    [my code starts here]

ただし、上記の1行を変更して、InputStreamBodyを同等のByteArrayBodyに置き換えると、すべて問題ありません。

entity.addPart("data", new ByteArrayBody(new byte[1], filename));

私は何が間違っているのですか?

(そして、InputStreamBodyは実際にデータをストリーミングしますか、それとも時間を無駄にしますか?)

HttpClient-4.2.1を使用しています

4

1 に答える 1

2

あなたがしていることに何も悪いことはありません。問題は、 HttpClientを使用ByteArrayBodyすると、リクエストコンテンツの合計の長さを計算し、を使用してメッセージを描画できるのContent-Lengthに対し、HttpClientを使用する場合InputStreamBodyは、コンテンツのチャンク化(Transfer-Encodingヘッダーを使用)に頼らなければならないことです。サーバーサイドスクリプトは、Content-Lengthヘッダーのないリクエストを処理できないのではないかと思います。

于 2012-07-25T08:47:07.780 に答える