需要的长度411:使用apache(4.3)HttpPost和MultipartEntityBuilder上传文件。

时间:2014-05-22 09:53:15

标签: apache apache-httpclient-4.x

我使用的是HttpClient 4.3.3。我的任务是将文件上传到服务器上。 以下是我的代码:

    InputStream inputStream = new FileInputStream(new File("/path/to/file"));
    byte[] data;
    data = IOUtils.toByteArray(inputStream);
    InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data),"file-name-on-ser");

    MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();   

    multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

    multipartEntity.addPart("file",inputStreamBody);

    HttpPost httpPost = new HttpPost("file upload URL");

    httpPost.setEntity(multipartEntity.build());

    CloseableHttpResponse response  = httpclient.execute(httpPost); 

    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

      String line = "";

      while ((line = rd.readLine()) != null) 
      {
        System.out.println(line);
      }

当我运行此代码时,它成功连接到服务器。但响应的输出是

         <html>
         <head><title>411 Length Required</title></head>
         <body bgcolor="white">
         <center><h1>411 Length Required</h1></center>
         <hr><center>server-name</center>
         </body>
         </html>

当我使用firebug进行调试时,我看到以下Request头。

响应标题查看来源

Cache-Control no-store,no-cache

连接保持活力

日期星期四,2014年5月22日08:58:02 GMT

保持活动超时= 30

服务器*****

Set-Cookie **** Path = /

转移编码分块

请求标题浏览源

接受text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8

接受编码gzip,deflate

Accept-Language en-US,en; q = 0.5

连接保持活力

Cookie ****

主持人*****

Referer https:// **** / shareupload /

User-Agent Mozilla / 5.0(Windows NT 6.1; rv:29.0)Gecko / 20100101 Firefox / 29.0

从上传流请求标题

Content-Length 12642

Content-Type multipart / form-data;边界= --------------------------- 105143784893

我在堆栈溢出时遇到过类似的问题。

1)411 Content-Length Required

2)File upload using apache's httpclient library not working

但我仍然无法找到问题的解决方案。 我是否需要在请求标头中设置Content-Length和Content-Type参数?

提前谢谢你。

1 个答案:

答案 0 :(得分:1)

尝试:

    InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data),"file-name-on-ser"){
            @Override
            public long getContentLength(){return data.length();}
    };