Java 当使用ApacheHttpClient发布多端口时,ByteArrayBody工作,但InputStreamBody抛出NoHttpResponseException

Java 当使用ApacheHttpClient发布多端口时,ByteArrayBody工作,但InputStreamBody抛出NoHttpResponseException,java,http,apache-httpclient-4.x,Java,Http,Apache Httpclient 4.x,我正试图发布一些从InputStream获取的数据。我希望避免首先将所有数据收集到一个字节数组中,而将数据流化,以节省内存(我发布的数据大约为10MB) 如果我运行以下命令: DefaultHttpClient httpclient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(target_url); MultipartEntity entity = new MultipartEntity(); entity.addPa

我正试图发布一些从InputStream获取的数据。我希望避免首先将所有数据收集到一个字节数组中,而将数据流化,以节省内存(我发布的数据大约为10MB)

如果我运行以下命令:

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]
但是,如果我更改上面的一行,用等效的ByteArrayBody替换InputStreamBody,则一切正常:

entity.addPart("data", new ByteArrayBody(new byte[1], filename));
我做错了什么

(InputStreamBody真的会流式传输数据吗,还是我在浪费时间?)


我使用的是HttpClient-4.2.1

您所做的一切都没有问题。问题很可能是,当使用
ByteArrayBody
HttpClient时,它能够使用
content length
计算总请求内容长度并描绘消息,而当使用
InputStreamBody
HttpClient时,它必须求助于内容分块(使用
传输编码
头)。我怀疑服务器端脚本根本无法处理没有
内容长度
标题的请求。

有道理,谢谢!我想我还是坚持用
ByteArrayBody