【问题标题】:Java Apache HttpClient error uploading filesJava Apache HttpClient错误上传文件
【发布时间】:2013-12-14 07:02:10
【问题描述】:

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

为什么 new File() 和 new FileInputStream() 之间会出现这种奇怪的行为?

【问题讨论】:

  • 得到响应后关闭连接。 fos.close();
  • 你的意思是FileOutputStream吗?你真的可以忽略这个,它只是写入一个临时文件。
  • 哎呀抱歉.....你可以创建一个输入流的实例并将其传递给 addBinaryBody 方法,一旦你收到响应关闭使用实例的连接
  • 我试过了(查看我更新的代码),但没有任何变化

标签: java http apache-httpclient-4.x


【解决方案1】:

这一切都很简单。在前一种情况下,多部分实体内容的总长度可以在其所有部分的长度已知的情况下计算出来。此类实体可以包含在由Content-Length 标头分隔的请求中。在后一种情况下,无法确定总实体长度,并且请求使用块编码传输。显然,某些协议合规性有限的服务器端脚本无法处理没有 Content-Length 标头的请求。

【讨论】:

  • 我知道内容长度(这个inputstream是filestream),可以强制吗?
  • 我解决了扩展 org.apache.http.entity.mime.content.InputStreamBody 更改公共 long getContentLength() 方法的问题。谢谢。
  • 除了扩展InputStreamBody之外的任何解决方案?
猜你喜欢
  • 2017-11-05
  • 2023-03-14
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2011-01-10
  • 2012-04-30
  • 2011-10-08
  • 1970-01-01
相关资源
最近更新 更多