1.概述
在本教程中,我们将演示如何做使用HttpClient 4的多部分上传操作。
我们将使用http://echo.200please.com作为测试服务器,因为它是公共的,它接受大多数类型的内容。
如果你想深入了解学习使用HttpClient可以做的其他很酷的事情-去主httpclient教程。
2.使用addpart.方法
让我们从看MultipartEntityBuilder反对向Http实体添加部件然后将通过邮政操作上传。
这是一个向控件添加部件的通用方法htthentity.代表形式。
例2.1。- - - - - -上传一个包含两个文本部分和一个文件的表单
File File = new File(textFileName);HttpPost = new HttpPost("http://echo.200please.com");FileBody FileBody =新的FileBody(文件,contentType.default_binary);stringbody stringbody1 =新字符串(“消息1”,contentType.multipart_form_data);stringbody stringbody2 =新字符串(“消息2”,contentType.multipart_form_data);// MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE);builder.addpart(“upfile”,文件组);builder.addpart(“text1”,stringbody1);builder.addpart(“text2”,stringbody2); HttpEntity entity = builder.build(); // post.setEntity(entity); HttpResponse response = client.execute(post);
注意,我们正在实例化文件对象,同时指定ContentType服务器使用的值。
另外,请注意addPart方法有两个参数,其作用类似于核心价值成对的形式。只有当服务器端实际期望并使用参数名时,它们才相关——否则,它们将被忽略。
3.使用addBinaryBody和addTextBody方法
创建多部分实体的更直接方式是使用addBinaryBody和AddTextBody方法。这些方法用于上传文本,文件,字符数组和InputStream.对象。让我们用简单的例子来说明如何做到这一点。
例3.1。- - - - - -上传文本和一个文本文件部分
HttpPost = new HttpPost("http://echo.200please.com");File File = new File(textFileName);String message = "这是一个多部分的帖子";MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE);构建器。ContentType addBinaryBody(“upfile”文件。DEFAULT_BINARY textFileName);构建器。addTextBody(“文本”,消息,ContentType.DEFAULT_BINARY);// HttpEntity实体= builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);
请注意,FileBody和StringBody这里不需要对象。
同样重要的是,大多数服务器都不检查ContentType文本主体的addTextBody方法可以省略ContentType价值。
的addBinaryBodyAPI接受一个ContentType,但它也可以仅从二进制主体和保存文件的表单参数的名称创建实体。如前一节所述,如果ContentTypevalue未指定。
接下来,我们将添加一个zip文件作为InputStream,而图像文件将被添加为文件目的:
例3.2。- - - - - -上传一个zip文件,图像文件和文本部分
HttpPost = new HttpPost("http://echo.200please.com");InputStream = new FileInputStream(zipFileName);File File = new File(imageFileName);String message = "这是一个多部分的帖子";MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE);构建器。addBinaryBody ("upfile", file, ContentType。DEFAULT_BINARY imageFileName);构建器。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.部分。我们在第一行代码中实例化的服务器能够识别InputStream.年代。
现在让我们看看另一个例子addBinaryBody正在使用字节数组正常工作:
例3.3。- - - - - -上传字节数组和文本
HttpPost = new HttpPost("http://echo.200please.com");String message = "这是一个多部分的帖子";byte[] bytes = "二进制代码".getBytes();// MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE);构建器。ContentType addBinaryBody(“upfile字节。DEFAULT_BINARY textFileName);构建器。addTextBody(“文本”,消息,ContentType.TEXT_PLAIN);// HttpEntity实体= builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);
注意到ContentType-现在指定二进制数据。
4.结论
本文介绍了MultipartEntityBuilder作为一个灵活的对象,提供多个API选择以创建多级表单。
示例还展示了如何使用HttpClient上传一个HttpEntity类似于表格实体。
实现所有这些示例和代码片段可以在我们的GitHub项目-这是一个基于eclipse的项目,所以它应该很容易导入和运行。