我想使用 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)的答案:
为什么 new File() 和 new FileInputStream() 之间会有这种奇怪的行为?
最佳答案
这一切都非常简单。在前一种情况下,可以计算多部分实体内容的总长度,因为它的所有部分的长度都是已知的。此类实体可以包含在由 Content-Length
header 分隔的请求中。在后一种情况下,无法确定总实体长度,并且使用块编码传输请求。显然,某些协议(protocol)合规性有限的服务器端脚本无法处理没有 Content-Length
header 的请求。
关于Java Apache HttpClient 上传文件时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20262769/