我想使用HttpClient 4.3.1上传文件。我需要添加以形成多部分输入流(以控制上载进度。)而不是File对象。 这是我的代码:
byte[] dump = ...;
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(SENDLOG_URL);
MultipartEntityBuilder meb = MultipartEntityBuilder.create();
meb.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
// THIS WORKS!! meb.addBinaryBody("log", new File("C:\\temp.zip"), ContentType.APPLICATION_OCTET_STREAM,"log.zip");
InputStream is=new FileInputStream("C:\\temp.zip")
meb.addBinaryBody("log", is, ContentType.DEFAULT_BINARY, "log.zip");
httppost.setEntity(meb.build());
HttpResponse resp=httpclient.execute(httppost);
is.close();
使用方法MultipartEntityBuilder.addBinaryBody(Strin,File)它可以工作,但是使用MultipartEntityBuilder.addBinaryBody(Strin,InputStream)它不起作用。
java客户端不会抛出任何错误,但这是远程服务器(Apache)的答案:
HTTP / 1.1 400错误请求 [日期:星期四,2013年11月28日09:46:08 GMT,服务器:Apache / 2.4.6(Unix)mod_fcgid / 2.3.7,内容长度:226, 连接:关闭,内容类型:text / html;字符集= ISO-8859-1]
为什么新File()和新FileInputStream()之间的这种奇怪行为?
答案 0 :(得分:2)
这一切都非常简单。在前一种情况下,可以在已知其所有部分的长度的情况下计算多部分实体内容的总长度。此类实体可以包含在由Content-Length
标头分隔的请求中。在后一种情况下,不能确定总实体长度,并且利用块编码来发送请求。显然,一些协议合规性有限的服务器端脚本无法处理没有Content-Length
标头的请求。