http://www.tuicool.com/articles/Y7reYb

1. 概述

本教程我们将描述如何使用 HttpClient 4进行一次多文件上传操作 .

我们将使用  http://echo.200please.com  作为测试服务器,因为它是面向公众的,并且接受大多数类型的内容.

如果你想要深入学习并了解你可以使用  HttpClient 做到的其它很棒的事情  – 那就去看看 首要的 HttpClient 教程吧   .

2. 使用  AddPart  方法

让我们开始研究研究  MultipartEntityBuilder  对象,来向一个Http实体添加成分,它在稍后将会被通过一个POST操作上传.

这是向一个 HttpEntity添加成分来表示表单的一般方法 .

示例 2.1. - 使用两个文本成分和一个文件上传一个表单

  1. File file = new File(textFileName, ContentType.DEFAULT_BINARY);
  2. HttpPost post = new HttpPost("http://echo.200please.com");
  3. FileBody fileBody = new FileBody(file);
  4. StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA);
  5. StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA);
  6. //
  7. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  8. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
  9. builder.addPart("upfile", fileBody);
  10. builder.addPart("text1", stringBody1);
  11. builder.addPart("text2", stringBody2);
  12. HttpEntity entity = builder.build();
  13. //
  14. post.setEntity(entity);
  15. HttpResponse response = client.execute(post);

请注意我们也通过制定将会被服务器使用到的ContentType值来实例化File对象.

同样还请注意  addPart  方法有两个参数,作用就像是表单的键值对 . 除非服务器端实际需要这些值并使用了这些参数名称,它们就是有干系的,否则它们就会被简单的忽略掉.

3. 使用  addBinaryBody  和  addTextBody  方法

创建一个multipart实体更直接的方式就是使用  addBinaryBody  和  AddTextBody   方法. 这些方法服务于上传文本,文件,字符数组和  InputStream  对象. 我们用了一个简单的例子来描述如何使用它们 .

示例 3.1. - 上传一个文本和一个文本文件部分

  1. HttpPost post = new HttpPost("http://echo.200please.com");
  2. File file = new File(textFileName);
  3. String message = "This is a multipart post";
  4. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  5. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
  6. builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName);
  7. builder.addTextBody("text", message, ContentType.DEFAULT_BINARY);
  8. //
  9. HttpEntity entity = builder.build();
  10. post.setEntity(entity);
  11. HttpResponse response = client.execute(post);

注意这里不需要  FileBody  和  StringBody  对象

同样重要的是,大多数服务器不会检查文本体的  ContentType  , 因此  addTextBody 方法可能会忽略掉  ContentType  值 .

addBinaryBody 的  API 接受一个  ContentType  - 但是它也有可能从一个二进制体来创建实体,而对应名称的表单参数持有了这个文件. 如前面小节所述,如果ContentType值没有被指定,一些服务器将不会识别这个文件.

接下来,我们将一个zip文件作为一个  InputStream 添加进来,  而图片文件将会被作为File对象被添加进来:

示例 3.2. - 上传一个Zip文件,一个图片文件和一个文本 

  1. HttpPost post = new HttpPost("http://echo.200please.com");
  2. InputStream inputStream = new FileInputStream(zipFileName);
  3. File file = new File(imageFileName);
  4. String message = "This is a multipart post";
  5. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  6. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
  7. builder.addBinaryBody
  8. ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName);
  9. builder.addBinaryBody
  10. ("upstream", inputStream, ContentType.create("application/zip"), zipFileName);
  11. builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
  12. //
  13. HttpEntity entity = builder.build();
  14. post.setEntity(entity);
  15. HttpResponse response = client.execute(post);

请注意ContentType值可以被动态创建,正如上面这个针对zip文件的示例中所示 .

最后,不是所有的服务器都接受  InputStream  部分. 我们在代码的第一行实体化的服务器可以接受 .

让我们现在来看看另外一个示例,  addBinaryBody直接用于一个位数组  :

示例 3.3. - 上传一个位数组和文本

  1. HttpPost post = new HttpPost("http://echo.200please.com");
  2. String message = "This is a multipart post";
  3. byte[] bytes = "binary code".getBytes();
  4. //
  5. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  6. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
  7. builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName);
  8. builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
  9. //
  10. HttpEntity entity = builder.build();
  11. post.setEntity(entity);
  12. HttpResponse response = client.execute(post);

留意 ContentType  - 它现在被指定为二进制数据.

4. 总结

本文呈现了  MultipartEntityBuilder 作为一个灵活的对象提供了创建一个  multipart 表单多种API.

示例同样也展示了如何使用HttpClient上传一个类似于表单实体的HttpEntity .

这些示例的所有实现和代码块在  我的github项目  中可以找到 – 这是一个基于Eclipse的项目, 因此可以很容易的导入并运行.

转 使用 HttpClient 4 进行文件上传的更多相关文章

  1. HttpClient文件上传下载

    1 HTTP HTTP 协议可能是如今 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序须要直接通过 HTTP 协议来訪问网络资源. 尽管在 JDK 的 java.net ...

  2. HttpClient构造文件上传

    在项目中我们有时候需要使用到其他第三方的api,而有些api要求我们上传文件,search一下,下面将结果记录一下喽! 含义 ENCTYPE="multipart/form-data&quo ...

  3. springMVC + hadoop + httpclient 文件上传请求直接写入hdfs

    1.首先是一个基于httpclient的java 应用程序,代码在这篇文章的开头:点击打开链接 2.我们首先写一个基于springMVC框架的简单接收请求上传的文件保存本地文件系统的demo,程序代码 ...

  4. HttpClient由Client客户端上传File文件流至Server服务端

    客户端方法 public static void main(String[] args) { File file=new File("E:\\lucene\\rev\\全年平台受理量.doc ...

  5. Android开发之httpclient文件上传实现

    文件上传可能是一个比較耗时的操作,假设为上传操作带上进度提示则能够更好的提高用户体验,最后效果例如以下图: 项目源代码:http://download.csdn.net/detail/shinay/4 ...

  6. HttpClient多文件上传代码及普通参数中文乱码问题解决

    该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...

  7. Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)

    一.HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 ...

  8. (十)HttpClient以multipart/form-data上传文件

    原文链接:https://blog.csdn.net/wsdtq123/article/details/78888734 POST上传文件 最早的HTTP POST是不支持文件上传的,给编程开发带来很 ...

  9. 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传

    package org.caeit.cloud.dev.util; import java.io.File; import java.io.IOException; import java.io.Un ...

随机推荐

  1. Google 分布式关系型数据库 F1

    F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...

  2. 给EditText设置边框

    布局文件中加入background属性: <EditText android:layout_width="200dp" android:layout_height=" ...

  3. PMBok项目管理

    这就是项目管理的九大领域:整合管理.范围管理.时间管理.费用管理.质量管理.人力资源管理.沟通管理.风险管理.采购管理. 项目管理好像一头大象,将其大卸九块之后,要装进冰箱就容易多了. 看看书上是怎样 ...

  4. 其他信息: Error creating context 'spring.root': 未能加载文件或程序集“EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项

    详细错误情况: “System.Configuration.ConfigurationErrorsException”类型的异常在 Spring.Core.dll 中发生,但未在用户代码中进行处理 其 ...

  5. Qt使用中碰到的问题

    1.发现table第一列在切换后变黑,或多了行数. 一般是编译出来的.exe文件所使用的qt的dll不匹配造成的.一定要使用编译时,所使用的那个版本的qt的dll.

  6. iOS传值之通知传值(三)

    输入所要发送的信息 ,同时将label的值通过button方法调用传递, - (IBAction)buttonClick:(id)sender { //添加 字典,将label的值通过key值设置传递 ...

  7. swfupload在chrome中点击上传图片按钮无反应的解决办法

    chrome 22.0.XXXXX dev版上传图片按钮点击无反应原因:是GOOGLE的内建Flash PPAPI外挂所导致的. 问题原因: 由于Google浏览器(Chrome),在最新测试版22. ...

  8. 【最长下降子序列的长度和个数】 poj 1952

    转自http://blog.csdn.net/zhang360896270/article/details/6701589 这题要求最长下降子序列的长度和个数,我们可以增加数组maxlen[size] ...

  9. LightOJ 1336 Sigma Function 算数基本定理

    题目大意:f(n)为n的因子和,给出 n 求 1~n 中f(n)为偶数的个数. 题目思路:算数基本定理: n=p1^e1*p2^e1 …… pn^en (p为素数): f(n)=(1+p1+p1^2+ ...

  10. iOS 6 Passbook 入门 1/2

    http://www.raywenderlich.com/zh-hans/23066/ios-6-passbook-%E5%85%A5%E9%97%A8-12 iOS 6 Passbook 入门 1/ ...