当前位置: 首页 > news >正文

使用 HttpClient 4 进行文件上传

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

使用 HttpClient 4 进行文件上传 博客分类: 搜索引擎,爬虫

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 方法有两个参数,作用就像是表单的键值对 . 除非服务器端实际需要这些值并使用了这些参数名称,它们就是有干系的,否则它们就会被简单的忽略掉.

leoxu

leoxu

翻译于 1年前

0人顶

顶 翻译的不错哦!

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值没有被指定,一些服务器将不会识别这个文件.

leoxu

leoxu

翻译于 1年前

0人顶

顶 翻译的不错哦!

接下来,我们将一个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的项目, 因此可以很容易的导入并运行.

 

http://www.oschina.net/translate/httpclient-multipart-upload

转载于:https://my.oschina.net/xiaominmin/blog/1597142

相关文章:

  • 深入解析Spring Cloud内置的Zuul过滤器
  • exe4j打包jar文件成exe .
  • 使用 VisualVM 进行性能分析及调优
  • BZOJ1901:Zju2112 Dynamic Rankings——题解
  • Android交互
  • 第 15 章 Admonition 警告与提示
  • Android OkHttp简易使用
  • 怎么让div内容超出后自动显示滚动条
  • .NET使用存储过程实现对数据库的增删改查
  • extends继承
  • 《SqlServer 系列》 - 函数
  • Android 100+行实现本地跳一跳辅助(不需要连接电脑)
  • MyBatis DAO层传递参数到mapping.xml
  • 微内核与面向组件
  • 运维学python之爬虫中级篇(二)线程、协程
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【5+】跨webview多页面 触发事件(二)
  • 30秒的PHP代码片段(1)数组 - Array
  • angular学习第一篇-----环境搭建
  • CAP 一致性协议及应用解析
  • CEF与代理
  • CentOS6 编译安装 redis-3.2.3
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • ES2017异步函数现已正式可用
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Java面向对象及其三大特征
  • Netty源码解析1-Buffer
  • OSS Web直传 (文件图片)
  • webpack+react项目初体验——记录我的webpack环境配置
  • 从重复到重用
  • 老板让我十分钟上手nx-admin
  • 码农张的Bug人生 - 初来乍到
  • 三栏布局总结
  • 数据科学 第 3 章 11 字符串处理
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​configparser --- 配置文件解析器​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (23)Linux的软硬连接
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (ZT)薛涌:谈贫说富
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (全注解开发)学习Spring-MVC的第三天
  • (四)c52学习之旅-流水LED灯
  • (算法)Game
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (译)2019年前端性能优化清单 — 下篇
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转载)深入super,看Python如何解决钻石继承难题