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 .
相关推荐
在实现跨服务器文件上传时,首先需要配置jersey-client,设置目标服务器的URL、HTTP方法(通常是POST)以及文件的MIME类型。然后,使用jersey-client的API创建一个请求实体,将文件内容附加到请求中。此外,可能还...
6. **元数据管理**:FastDFS允许在文件上传时附加元数据,这些元数据可用于存储关于文件的额外信息,如文件类型、创建日期等。 7. **负载均衡**:FastDFS的客户端库会自动处理服务器之间的负载均衡,确保文件操作的...
标题中的"fastdfs-client-java-master.zip"是一个包含FastDFS客户端Java实现的压缩文件,这个库主要用来帮助Java应用程序与FastDFS分布式文件系统进行交互。FastDFS是一个开源的高性能、轻量级的分布式文件系统,...
1. 文件上传:FastDFS-client-java支持将本地文件上传至FastDFS服务器,支持单文件和批量文件上传,且在上传过程中支持断点续传,确保文件传输的完整性。 2. 文件下载:可以按照文件ID或路径下载服务器上的文件,...
它提供了文件上传、下载等基本功能,同时也支持文件的访问统计、文件访问权限控制等高级特性。在本实例中,我们将探讨如何将FastDFS与Java环境整合,实现文件的上传操作。 首先,FastDFS客户端(fastdfs-client)是...
例如,使用`TrackerClient`和`StorageClient`类进行文件上传,调用`upload_file`方法,传入文件路径、文件名、MIME类型等信息即可。 五、实战演练 1. 文件上传:创建一个Java程序,初始化`TrackerClient`和`...
`fastdfs-client-java`是FastDFS官方提供的Java语言客户端,它提供了丰富的API,支持文件上传、下载、删除、文件元数据查询等功能。该客户端包主要包含以下部分: 1. 连接管理:负责建立和管理到FastDFS服务器的...
3. **httpmime.jar**: 提供了MIME类型的支持,对于上传文件或处理多部分/表单数据的POST请求非常有用。 4. **httpclient-cache.jar**: 提供了HTTP缓存功能,能够存储先前获取的响应以便于快速重复访问。 5. **...
3. `httpmime-4.5.5.jar`:用于处理MIME类型的库,常用于上传文件或处理复杂的POST请求。 4. `httpclient-cache-4.5.5.jar`:缓存功能的实现,可以帮助减少网络请求,提高性能。 5. `httpasyncclient-4.1.4.jar`:...
- **上传文件**:首先创建`File`对象,然后调用`FastDFSClient`的`uploadFile`方法,传入文件对象、文件类型等参数,返回文件的存储路径。 - **下载文件**:根据文件ID,调用`FastDFSClient`的`downloadFile`方法...
7. **多部分表单数据**:支持MIME类型的多部分表单数据提交,这对于上传文件或处理复杂表单数据非常有用。 8. **国际化与本地化**:HttpClient允许开发者处理不同字符集和语言的HTTP内容,适应全球化的应用需求。 ...
Postman提供了一个直观的用户界面,允许用户轻松构建各种类型的HTTP请求。用户可以设置URL、选择HTTP方法、添加请求头、填充查询参数或路径参数,甚至可以上传文件作为请求体。这对于测试不同场景下的API非常有用。 ...
`httpmime`是HttpClient的一个扩展,主要处理MIME类型的数据,如表单数据、文件上传等。在4.5.6版本中,它提供了以下功能: 1. **MultipartEntityBuilder**:用于构建MIME类型的多部分实体,方便进行文件上传操作。 ...
2. **内容管理**:Pulpcore-Client支持对不同类型的软件包进行管理,包括但不限于RPM、deb和Python包。它能帮助用户高效地同步、分发和更新这些软件包到不同的环境中。 3. **仓库管理**:用户可以创建、更新和删除...
2. **Multipart/form-data上传**: 支持文件上传,适用于需要POST表单数据的场景。 3. **定时任务**: 可设置定时发送请求,用于模拟定期触发的API调用。 4. **脚本支持**: 使用JavaScript编写预请求和后请求脚本,...
4. 文件元数据操作:FastDFS允许在文件上传时附加元数据,如文件类型、大小等信息。客户端可以进行元数据的读取、修改和删除。 5. 文件访问:FastDFS支持HTTP协议访问文件,因此,通过Java FastDFS客户端,用户可以...
Pulp支持多种软件包格式,包括RPM、DEB、Python wheels等,因此`pulpcore-client`作为其客户端,允许开发者通过命令行接口或编程方式与Pulp服务器进行通信,实现对软件包的上传、下载、查询和管理等操作。...
1. **上传和下载**:库支持上传本地容器镜像到Pulp服务器,同时也可以从服务器下载镜像。 2. **查询和搜索**:可以查询服务器上已有的镜像信息,包括镜像的元数据,如标签、大小等,也可以通过特定条件进行搜索。 ...
- 元数据操作:客户端可以设置和获取文件的元数据,元数据通常包括文件的创建时间、大小、类型等信息。 - 文件删除:客户端可以请求删除FastDFS服务器上的文件。 - 负载均衡:FastDFS客户端支持自动选择负载较轻的...
**Python库 - jelastic-client-1.2.4.tar.gz** `jelastic-client` 是一个专为Python开发者设计的库,用于与Jelastic云平台进行交互。Jelastic是一款自动化云平台,提供高度可扩展的环境,支持多种服务器技术,如...