使用MultipartEntityBuilder实现文件上传
参考:【1】
原理
- 从httpclient 4.3开始,使用MultipartEntityBuilder实现文件上传
- 文件或者文件流可以封装成ContentBody,进而被封装到MultipartEntityBuilder中,再创建出multipartEntity,作为HTTP请求的HttpEntity,最终被发送到服务端。整个对象封装流程如下:File/Stream>>ContentBody>>MultipartEntityBuilder>>multipartEntity>>HttpEntity
准备工作
-
引入httpclient依赖
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.8</version> </dependency>
使用addPart+File方法上传
使用addPart(String name, ContentBody contentBody)方法完成上传,其中ContentBody的实现类是FileBody。支持一次传多个文件。
HttpPost uploadPost = new HttpPost(uri);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addPart(TENANT_ID, new StringBody(tenantId, ContentType.TEXT_PLAIN))
.addPart("path", new StringBody(path, ContentType.TEXT_PLAIN));
for (int i = 0; i < files.length; i++) {
FileBody fileBody = new FileBody(files[i]);
builder.addPart("file", fileBody);
}
HttpEntity multipartEntity = builder.build();
uploadPost.setEntity(multipartEntity);
CloseableHttpResponse response = httpClient.execute(uploadPost)
使用addPart+Stream方法上传
使用addPart(String name, ContentBody contentBody)方法完成上传,其中ContentBody的实现类是InputStreamBody。支持一次传多个文件。
HttpPost uploadPost = new HttpPost(uri);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addPart(TENANT_ID, new StringBody(tenantId, ContentType.TEXT_PLAIN))
.addPart("path", new StringBody(path, ContentType.TEXT_PLAIN));
for (int i = 0; i < files.length; i++) {
InputStreamBody inputStreamBody = new InputStreamBody(inputs[i], ContentType.APPLICATION_OCTET_STREAM, fileNames[i]);
builder.addPart("file", inputStreamBody);
}
HttpEntity multipartEntity = builder.build();
uploadPost.setEntity(multipartEntity);
CloseableHttpResponse response = httpClient.execute(uploadPost)
使用addBinaryBody上传
使用addBinaryBody(String name, InputStream stream, ContentType contentType, String filename)方法
HttpPost uploadPost = new HttpPost(uri);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addPart(TENANT_ID, new StringBody(tenantId, ContentType.TEXT_PLAIN))
.addPart("path", new StringBody(path, ContentType.TEXT_PLAIN))
.addBinaryBody("file", input, ContentType.APPLICATION_OCTET_STREAM, fileName);
HttpEntity multipartEntity = builder.build();
uploadPost.setEntity(multipartEntity);
CloseableHttpResponse response = httpClient.execute(uploadPost)