一. 概述
当我们从前端接收到文件,需要调用其他服务的接口转发这些文件时,大多数人会选择先下载到本地,然后再删除。这篇文章就介绍如何通过Apache HttpClient进行文件传输。从前端接收到文件后,无需下载到本地,直接进行转发。
二. Apache HttpClient 介绍
Apache HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。它支持HTTP协议最新的版本和建议,并且广泛应用于各种Java项目中,包括Apache Jakarta上的其他著名开源项目如Cactus和HTMLUnit。这里就不再继续赘述,有兴趣的可以专门去了解一下。
三.具体实现
1. 首先就是引入依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.13</version>
</dependency>
2.具体代码实现
private void submitAttachment(MultipartFile[] attachment) throws Exception {
//这里配置其他的表单参数,根据具体的接口而定
Map<String, Object> attachmentParam = new HashMap<>();
attachmentParam.put("filename", "GISERRORREPORT");
//这里是需要转发文件的url
String attPath = "www.baidu.com";
CloseableHttpClient httpClient = HttpClients.createDefault();
JSONObject jsonResult = null;
// 创建HttpPost实例
HttpPost httpPost = new HttpPost(attPath);
// 请求参数配置,设置超时信息
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000)
.setConnectionRequestTimeout(60000).build();
httpPost.setConfig(requestConfig);
try {
//用于构建HTTP POST请求的多部分实体(multipart/form-data)
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(StandardCharsets.UTF_8);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//拓展多文件传输,单文件同理
for (MultipartFile file : attachment) {
String fileName = file.getOriginalFilename();
// 添加文件流,"file"为实际表单参数的key
builder.addBinaryBody("file", file.getInputStream(), ContentType.create(file.getContentType()), fileName);
}
//将其他表单参数加入builder当中
for (Map.Entry<String, Object> entry : attachmentParam.entrySet()) {
builder.addPart(entry.getKey(), new StringBody((String) entry.getValue(), ContentType.create("text/plain", Consts.UTF_8)));
}
//构建HttpPost实例的实体部分
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
// 执行提交
HttpResponse response = httpClient.execute(httpPost);
//获取接口返回code
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 将返回结果转化成res和json对象
String res = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
jsonResult = JSONObject.parseObject(res);
log.info("res:{}", res);
}
} catch (Exception e) {
e.printStackTrace();
log.error("调用HttpPost失败!" + e.getMessage());
} finally {
if (httpClient != null) {
try {
httpClient.close();
} catch (IOException e) {
log.error("关闭HttpPost连接失败!");
}
}
}
}
因为 Apache HttpClient 的特性,所以代码行数较多,因为它可以更加精确的定制Http请求,这里的Json使用的是FastJson。
如果解决了您的问题,麻烦一键三连吧!