我想使用 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/

10-12 00:37
查看更多