HttpClient 实现文件的上传

本文介绍使用HttpClient通过PostMethod和HttpPost两种方式上传文件的方法,并演示如何同时传递其他参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpClient有两种形式,一种是org.apache.http下的,一种是org.apache.commons.httpclient.HttpClient。

文件上传可以使用两种方式实现,一种是PostMethod方式,一种是HttpPost方式。两者的处理大同小异。PostMethod是使用FileBody将文件包装流包装起来,HttpPost是使用FilePart将文件流包装起来。在传递文件流给服务端的时候,都可以同时传递其他的参数。

PostMethod方式

将文件封装到FilePart中,放入Part数组,同时,其他参数可以放入StringPart中,这里没有写,只是单纯的将参数以setParameter的方式进行设置。此处的HttpClient是org.apache.commons.httpclient.HttpClient。


public void upload(String localFile){
          File file = new File(localFile);
          PostMethod filePost = new PostMethod(URL_STR);
          HttpClient client = new HttpClient();
          
          try {
              // 通过以下方法可以模拟页面参数提交
              filePost.setParameter("userName", userName);
              filePost.setParameter("passwd", passwd);
 
             Part[] parts = { new FilePart(file.getName(), file) };
             filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
             
             client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
             
             int status = client.executeMethod(filePost);
             if (status == HttpStatus.SC_OK) {
                 System.out.println("上传成功");
             } else {
                 System.out.println("上传失败");
             }
         } catch (Exception ex) {
             ex.printStackTrace();
         } finally {
             filePost.releaseConnection();
         }
     }

 HttpPost方式

这种方式,与上面类似,只不过变成了FileBody。上面的Part数组在这里对应HttpEntity此处的HttpClient是org.apache.http.client.methods下的。


public void upload(String localFile){
          CloseableHttpClient httpClient = null;
          CloseableHttpResponse response = null;
          try {
              httpClient = HttpClients.createDefault();
              
              // 把一个普通参数和文件上传给下面这个地址 是一个servlet
              HttpPost httpPost = new HttpPost(URL_STR);
            
             // 把文件转换成流对象FileBody
             FileBody bin = new FileBody(new File(localFile));
 
             StringBody userName = new StringBody("Scott", ContentType.create(
                     "text/plain", Consts.UTF_8));
             StringBody password = new StringBody("123456", ContentType.create(
                     "text/plain", Consts.UTF_8));
 
             HttpEntity reqEntity = MultipartEntityBuilder.create()
                     // 相当于<input type="file" name="file"/>
                     .addPart("file", bin)
                     
                     // 相当于<input type="text" name="userName" value=userName>
                     .addPart("userName", userName)
                     .addPart("pass", password)
                     .build();
 
             httpPost.setEntity(reqEntity);
 
             // 发起请求 并返回请求的响应
             response = httpClient.execute(httpPost);
             
             System.out.println("The response value of token:" + response.getFirstHeader("token"));
                 
             // 获取响应对象
             HttpEntity resEntity = response.getEntity();
             if (resEntity != null) {
                 // 打印响应长度
                 System.out.println("Response content length: " + resEntity.getContentLength());
                 // 打印响应内容
                 System.out.println(EntityUtils.toString(resEntity, Charset.forName("UTF-8")));
             }
             
             // 销毁
             EntityUtils.consume(resEntity);
         }catch (Exception e){
             e.printStackTrace();
         }finally {
             try {
                 if(response != null){
                     response.close();
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }
             
             try {
                 if(httpClient != null){
                     httpClient.close();
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }



转载来源:http://www.linuxidc.com/Linux/2014-07/104303.htm


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值