使用 HttpClient 4 进行文件上传
2015-06-06 16:22
561 查看
概述
本教程我们将描述如何使用 HttpClient 4进行一次多文件上传操作 .
我们将使用 http://echo.200please.com 作为测试服务器,因为它是面向公众的,并且接受大多数类型的内容.
如果你想要深入学习并了解你可以使用 HttpClient 做到的其它很棒的事情 – 那就去看看 首要的 HttpClient 教程吧 .
使用 AddPart 方法
让我们开始研究研究 MultipartEntityBuilder 对象,来向一个Http实体添加成分,它在稍后将会被通过一个POST操作上传.
这是向一个 HttpEntity添加成分来表示表单的一般方法 .
示例 2.1. - 使用两个文本成分和一个文件上传一个表单
请注意我们也通过制定将会被服务器使用到的ContentType值来实例化File对象.
同样还请注意 addPart 方法有两个参数,作用就像是表单的键值对 . 除非服务器端实际需要这些值并使用了这些参数名称,它们就是有干系的,否则它们就会被简单的忽略掉.
使用 addBinaryBody 和 addTextBody 方法
创建一个multipart实体更直接的方式就是使用 addBinaryBody 和 AddTextBody 方法. 这些方法服务于上传文本,文件,字符数组和 InputStream 对象. 我们用了一个简单的例子来描述如何使用它们 .
示例 3.1. - 上传一个文本和一个文本文件部分
注意这里不需要 FileBody 和 StringBody 对象
同样重要的是,大多数服务器不会检查文本体的 ContentType , 因此 addTextBody 方法可能会忽略掉 ContentType 值 .
addBinaryBody 的 API 接受一个 ContentType - 但是它也有可能从一个二进制体来创建实体,而对应名称的表单参数持有了这个文件. 如前面小节所述,如果ContentType值没有被指定,一些服务器将不会识别这个文件.
接下来,我们将一个zip文件作为一个 InputStream 添加进来, 而图片文件将会被作为File对象被添加进来:
示例 3.2. - 上传一个Zip文件,一个图片文件和一个文本 块
请注意ContentType值可以被动态创建,正如上面这个针对zip文件的示例中所示 .
最后,不是所有的服务器都接受 InputStream 部分. 我们在代码的第一行实体化的服务器可以接受 .
让我们现在来看看另外一个示例, addBinaryBody直接用于一个位数组 :
示例 3.3. - 上传一个位数组和文本
留意 ContentType - 它现在被指定为二进制数据.
总结
本文呈现了 MultipartEntityBuilder 作为一个灵活的对象提供了创建一个 multipart 表单多种API.
示例同样也展示了如何使用HttpClient上传一个类似于表单实体的HttpEntity .
这些示例的所有实现和代码块在 我的github项目 中可以找到 – 这是一个基于Eclipse的项目, 因此可以很容易的导入并运行.
本教程我们将描述如何使用 HttpClient 4进行一次多文件上传操作 .
我们将使用 http://echo.200please.com 作为测试服务器,因为它是面向公众的,并且接受大多数类型的内容.
如果你想要深入学习并了解你可以使用 HttpClient 做到的其它很棒的事情 – 那就去看看 首要的 HttpClient 教程吧 .
使用 AddPart 方法
让我们开始研究研究 MultipartEntityBuilder 对象,来向一个Http实体添加成分,它在稍后将会被通过一个POST操作上传.
这是向一个 HttpEntity添加成分来表示表单的一般方法 .
示例 2.1. - 使用两个文本成分和一个文件上传一个表单
File file = new File(textFileName, ContentType.DEFAULT_BINARY); HttpPost post = new HttpPost("http://echo.200please.com"); FileBody fileBody = new FileBody(file); StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("upfile", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); HttpEntity entity = builder.build(); // post.setEntity(entity); HttpResponse response = client.execute(post);
请注意我们也通过制定将会被服务器使用到的ContentType值来实例化File对象.
同样还请注意 addPart 方法有两个参数,作用就像是表单的键值对 . 除非服务器端实际需要这些值并使用了这些参数名称,它们就是有干系的,否则它们就会被简单的忽略掉.
使用 addBinaryBody 和 addTextBody 方法
创建一个multipart实体更直接的方式就是使用 addBinaryBody 和 AddTextBody 方法. 这些方法服务于上传文本,文件,字符数组和 InputStream 对象. 我们用了一个简单的例子来描述如何使用它们 .
示例 3.1. - 上传一个文本和一个文本文件部分
HttpPost post = new HttpPost("http://echo.200please.com"); File file = new File(textFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);
注意这里不需要 FileBody 和 StringBody 对象
同样重要的是,大多数服务器不会检查文本体的 ContentType , 因此 addTextBody 方法可能会忽略掉 ContentType 值 .
addBinaryBody 的 API 接受一个 ContentType - 但是它也有可能从一个二进制体来创建实体,而对应名称的表单参数持有了这个文件. 如前面小节所述,如果ContentType值没有被指定,一些服务器将不会识别这个文件.
接下来,我们将一个zip文件作为一个 InputStream 添加进来, 而图片文件将会被作为File对象被添加进来:
示例 3.2. - 上传一个Zip文件,一个图片文件和一个文本 块
HttpPost post = new HttpPost("http://echo.200please.com"); InputStream inputStream = new FileInputStream(zipFileName); File file = new File(imageFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("upstream", inputStream, ContentType.create("application/zip"), zipFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);
请注意ContentType值可以被动态创建,正如上面这个针对zip文件的示例中所示 .
最后,不是所有的服务器都接受 InputStream 部分. 我们在代码的第一行实体化的服务器可以接受 .
让我们现在来看看另外一个示例, addBinaryBody直接用于一个位数组 :
示例 3.3. - 上传一个位数组和文本
HttpPost post = new HttpPost("http://echo.200please.com"); String message = "This is a multipart post"; byte[] bytes = "binary code".getBytes(); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);
留意 ContentType - 它现在被指定为二进制数据.
总结
本文呈现了 MultipartEntityBuilder 作为一个灵活的对象提供了创建一个 multipart 表单多种API.
示例同样也展示了如何使用HttpClient上传一个类似于表单实体的HttpEntity .
这些示例的所有实现和代码块在 我的github项目 中可以找到 – 这是一个基于Eclipse的项目, 因此可以很容易的导入并运行.
相关文章推荐
- 电脑网络设置
- cocos2d-x lua 使用http(下载图片, POST JSON)
- TCP的三次握手及其抓包
- java http get、post方式
- [其他] Metasploit_bind_tcp 实战应用记录
- Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1
- Linux常用网络工具:路由扫描之traceroute
- HttpClient访问的多线程问题
- HttpServlet was not found on the Java
- 网络基本功----五层协议
- Android HTTP通信
- Android网络通信
- centos下LAMP之源码编译安装httpd
- android中Post方式发送HTTP请求
- hive mysql http://sishuok.com/forum/blogPost/list/6221.html
- caffe 的损失函数 loss 原文解析-多个损失函数 loss 网络搭建
- okhttp
- 7.oracle学习入门系列之七---网络管理与配置
- Tcp客户端并发登录
- http://www.riemers.net/