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.使用addBinaryBodyaddTextBody方法

创建多部分实体的更直接方式是使用addBinaryBodyAddTextBody方法。这些方法用于上传文本,文件,字符数组和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);

请注意,FileBodyStringBody这里不需要对象。

同样重要的是,大多数服务器都不检查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的项目,所以它应该很容易导入和运行。

通用的底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
15注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!