转 使用 HttpClient 4 进行文件上传
http://www.tuicool.com/articles/Y7reYb
1. 概述本教程我们将描述如何使用 HttpClient 4进行一次多文件上传操作 . 我们将使用 http://echo.200please.com 作为测试服务器,因为它是面向公众的,并且接受大多数类型的内容. 如果你想要深入学习并了解你可以使用 HttpClient 做到的其它很棒的事情 – 那就去看看 首要的 HttpClient 教程吧 . 2. 使用 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 方法有两个参数,作用就像是表单的键值对 . 除非服务器端实际需要这些值并使用了这些参数名称,它们就是有干系的,否则它们就会被简单的忽略掉. |
3. 使用 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 - 它现在被指定为二进制数据. 4. 总结本文呈现了 MultipartEntityBuilder 作为一个灵活的对象提供了创建一个 multipart 表单多种API. 示例同样也展示了如何使用HttpClient上传一个类似于表单实体的HttpEntity . 这些示例的所有实现和代码块在 我的github项目 中可以找到 – 这是一个基于Eclipse的项目, 因此可以很容易的导入并运行. |
转载于:https://www.cnblogs.com/wikiki/p/4343737.html
转 使用 HttpClient 4 进行文件上传相关推荐
- java http 上传文件_java利用httpClient实现后台文件上传请求
之前写过基于html和js的文件上传方法java 用springMVC 和HttpServletRequest 两种实现文件上传的方法和httpClient后台执行普通post请求的文章java通过h ...
- java httpclient 进度条_如何使用Apache HttpClient 4获取文件上传的进度条?
小编典典 大家好! 我自己解决了这个问题,并给出了一个简单的例子. 如有任何疑问,请随时提问. 开始了! ApplicationView.java import java.awt.event.Acti ...
- multipart/form-data与httpclient文件上传
写在前面:本文讨论的内容都是基于java相关技术栈. 文件上传无论是在传统的基于html的web系统开发,还是目前主流的移动app开发,都是一个比较常见的功能需求.例如:web oa系统,可能会涉及到 ...
- Android 文件上传的几种方式
这两天和新来的同事做一个项目,用到了文件上传,在这里记录下历程 Android文件上传有各种各样的Http框架,我也就简单说说我常用的吧,LiteHttp,OkHttp的封装还没做完全,有时间会补上, ...
- apache httpclient 工具类_Httpclient实现文件上传、文件下载看这篇文章就够了
前言: 使用httpclient实现文件的上传下载,废话补不多说,直接上概念上代码. 1.相关概念: 1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 ...
- android使用HttpURLConnection/HttpClient实现带参数文件上传
本文参考自[http://blog.csdn.net/crazy__chen/article/details/47703781] 在Android 2.3及以上版本,使用的是HttpURLConnec ...
- httpclient base64 文件上传_选择HttpClient还是OkHttp?
来源:https://urlify.cn/IBbMRn 写在前面 为什么会写这篇文章,起因于和朋友的聊天 这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okht ...
- Apache HttpClient 客户端使用详解、文件上传、文件下载
目录 HttpClient 概述与下载 Http Get 请求(文件下载) Http POST 请求(文件上传) Http Put 请求 Http Delete 请求 异步执行请求 HttpClien ...
- httpclient base64 文件上传_文件上传下载
说道文件上传下载,这个业务需求并不是很复杂思想如下 1.将文件上传到 某台服务器上的指定的路径下也可以这样理解 文件上传就是将本地图片发送到别的地方,下载就是将别的地方的图片放在本地 2.将路径同文件 ...
最新文章
- BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)
- 最流行的解压缩软件--winrar
- wifi 7都来了?
- microsoft已暂时停用你的用户_Windows10 20年10月重大更新来了,但它已存在问题
- Anbox 和 LXC 代码规模
- 关于程序员面试的一点想法
- 适用于Java开发人员的Elasticsearch教程
- Oracle 控制文件管理
- [转载] C#面向对象设计模式纵横谈——16 Interpreter解释器模式
- STM32 HAL库学习系列第3篇 常使用的几种延时方式
- javascript无限弹窗_解决下javascript无限弹窗的问题
- JSP九大内置对象的作用和用法
- strcmp()函数用法及其详解
- mysql数据库命令从哪里输入_mysql数据库操作命令
- 计算机显卡驱动不匹配,显卡驱动不兼容怎么办 显卡驱动降低旧版本方法
- php无法找到该页,UCHOME出现问题(转帖)
- [WPF] 使用 Effect 玩玩阴影、内阴影、 长阴影
- 使用Hibernate中save方法时由于设置的id的增长方式为assigned报错处理和
- VCM 音圈电机 (马达)Voice Coil Motor
- Vmware虚拟机Ubuntu未发现WiFi适配器解决方案汇总
热门文章
- druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库
- ios 静态方法是否能被重写_小米新系统亮相,比苹果iOS更干净,21款手机支持升级...
- java websocket 库_Java 项目中的 WebSocket 实现
- redis相比memcached有哪些优势?
- tomcat与jvm的关系分析
- 056_Unicode字符官方标准七
- 033_字符集和编码
- 002_推箱子-关卡数据
- python数据框添加一列无列名_Python将列添加到数据框导致NaN
- Java数据结构与算法:栈