`

HTTP-CLIENT支持的上传类型

    博客分类:
  • java
 
阅读更多

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 .

分享到:
评论

相关推荐

    java开源包1

    使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的...

    android-client:适用于MifosX平台的android客户端

    它基于Mifos X –一个强大的核心银行平台,专为外勤人员开发,他们可以使用该平台处理交易,跟踪客户的数据,中心记录,组详细信息,银行的不同类型的账户(贷款,储蓄和经常性)。客户端,运行客户端报告等。其...

    play框架手册

    支持类型的数组或集合 - 28 - POJO对象绑定 - 29 - JPA 对象绑定 - 30 - 定制绑定 - 30 - @play.data.binding.As - 30 - @play.data.binding.NoBinding - 31 - play.data.binding.TypeBinder - 31 - @play.data....

    play framework 框架手册 word 版

    支持类型的数组或集合 - 28 - POJO对象绑定 - 29 - JPA 对象绑定 - 30 - 定制绑定 - 30 - @play.data.binding.As - 30 - @play.data.binding.NoBinding - 31 - play.data.binding.TypeBinder - 31 - @play.data....

    免费开源最新版FileZilla Client 3.6.0.2

    编辑本段更新日志v3.6.0.1(2012-11-18)- 修正问题,包括选择TLS密码,GnuTLS bug修复- 修正了在关闭时的奔溃- 添加日志信息的服务器不使用UTF-8- 小的性能和内存优化得到的文件类型- 提高传输速度的格式 ...

    FileZilla Client is 3.65.0

    可以断点续传进行上传、下载(需要服务器支持) 自定义命令 可进行站点管理 防发呆功能(有的 FTP 服务器会将发呆过久的用户赶出,这样发呆的用户就得重复登录) 超时侦测 支持防火墙 支持 SOCKS4/5、...

    大名鼎鼎SWFUpload- Flash+JS 上传

    *.gif", 允许上传的文件类型  file_types_description: "Web Image Files", 文件类型描述  file_size_limit : "1024", 上传文件体积上限,单位MB  file_upload_limit : 10, 限定用户一次性最多上传多少个文件,...

    apollo_upload_server-ruby

    中间件,允许您使用 , 和Ruby on Rails上载文件。 注意:此实现使用 ,因此您应该使用apollo-upload-client库> = v7.0.0-alpha.3。 如果需要支持,则必须使用此gem的。 安装 将此行添加到您的应用程序的Gemfile中...

    NDlog 单用户博客系统 v1.5 Build 140404 UTF-8.zip

    [后台]修正博客模块添加内容和修改内容查看已上传附件无效的问题。 [前台]修正"News"模块批量删除SQL错误 [前台]修正"Links"模块卸载时的错误类型 [前台]修正路由规则对"module"、"search"模块的支持 [前台]修正...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有JavaScript,没有CSS,没有UpdatePanel,没有WebServices的Web应用程序。 支持的浏览器: IE 7.0+, Firefox 3.0+, Chrome ...

    简历文件批量上传工具

    --支持上传的文件类型--> <!--,pdf,txt,html,htm"/>--> ,pdf,txt,html,htm,mht"/> <!--简历的渠道 1:招聘网站,2:猎头招聘,3:员工推荐,4:现场招聘,5:校园招聘,6:媒体广告,7:官网,8:企业人才库,9...

    基于 ricq 包装,供 Python 使用的 QQ 无头客户端+源代码+文档说明

    ### 消息类型 - [x] 文本 - [x] 表情 - [x] At - [ ] 回复 - [ ] 匿名 - [ ] 骰子 - [ ] 石头剪刀布 - [ ] 图片 - [ ] 语音 - [ ] 长消息(仅支持群聊发送) - [ ] 合并转发(仅支持群聊发送) - [ ] 链接分享 - [ ] 小...

    hello-google-photos:在Go中使用Google Photos Library API上传照片

    创建应用程序类型为其他类型的OAuth客户端ID。 设置以下环境变量: export GOOGLE_CLIENT_ID= export GOOGLE_CLIENT_SECRET= ./hello-google-photos photo1.jpg photo2.jpg 这些照片将被上传到您的Google相册库...

    ECMall 2.3.0 繁体utf-8.zip

    5、优化 后台可配置session服务类型,增加memcached服务支持 6、优化 后台可配置缓存服务类型,增加memcached服务支持 7、优化 解除单域名限制 8、优化 后台可更改目录名称 9、修复 若干bug ECMall安装说明: ...

    node-libcurl:Node.js的libcurl绑定

    节点库 适用于Node.js的URL传输库。 Node.js的绑定。 libcurl官方描述: libcurl是一个免费且易于使用的客户端URL传输库,支持DICT,FILE,FTP,FTPS,Gopher,HTTP... MultiPart上传/ HttpPost libcurl选项(内容类

    ThinkSharp FTP Client Component for .NET-开源

    该程序集是用于与给定FTP服务器通信的客户端组件。 它没有GUI,但是具有丰富的底层功能,例如详细列表,递归上载,下载和删除。 它还支持BINARY / ASCII转换类型和ACTV / PASV模式

    RouterOS2.9.6.with.crack及配置动画

    支持DHCP(Server&Client;&Relay;)功能 12.基于地址,协议和端口的包过滤 13.基于站点、URL和关键字的应用层过滤 14.支持网络时间同步 15.支持UPnP 16.支持IP/MAC绑定 17.支持DNS代理 18.支持动态DNS 19.支持PPPOE...

    HTTP请求库java-requests.zip

    Requests, 是一个模仿python requests 模块来设计的Http lib,拥有简单而灵活的API,在容易使用的同时,又能够满足各种高级定制的使用,可是说是当前最好用的Java Http Client Lib。 简单的请求示例:String url =...

    apollo-android:针对JVM,Android和Kotlin多平台的强类型缓存GraphQL客户端

    阿波罗Android Apollo Android是...产品特点Java和Kotlin代码生成查询,变异和订阅响应的无反射解析HTTP缓存标准化缓存文件上传自定义标量类型支持RxJava2,RxJava3和协程入门如果您不熟悉GraphQL,请查看,将指导您使

Global site tag (gtag.js) - Google Analytics