MultipartEntityBuilder实现多附件上传
现在很多平台都会遇到与其它系统集成的情况。其中之一是调用第三方接口传输业务数据并上传文件。比如对方提供了这样一个文档:
我们可以先通过postman工具测试对方提供的接口,成功后可以通过该工具生成java代码使用,postman使用的是OkHttpClient来构建的请求。
这里我介绍的是MultipartEntityBuilder。
MultipartEntityBuilder是Apache HttpClient库中的一个实用工具,用于构建HTTP POST请求的多部分实体,它可以帮助开发人员轻松地将二进制数据添加到请求中,实现附件上传。
在MultipartEntityBuilder构建多部分实体时有一个比较重要的类是HttpMultipartMode,这个定义了如何将请求的各个部分组合在一起。HttpMultipartMode有几种不同的模式可供选择。
HttpMultipartMode.RFC6532:该规范定了定义了如何在multipart实体中处理unicode字符和国际化文本,该模式不会添加额外的空行。
HttpMultipartMode.BROWSER_COMPATIBLE:兼容浏览器模式,会在multipart实体的各部分之间添加一个额外的空行,已解决一些浏览器在解析multipart实体时可能出现的问题。
HttpMultipartMode.STRICT:严格模式,按照HTTP协议规定的格式来构建multipart实体,不会添加额外的空行。
最近在于第三方系统对接时,调用对方的接口上传文件,调用成功后到对方系统查看附件的文件名始终是乱码。后来发现,是MultipartEntityBuilder需要setMode(HttpMultipartMode.RFC6532)。
完整代码:
ContentType contentTypeJson = ContentType.create("application/json","UTF-8");
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
multipartEntityBuilder.setCharset(StandardCharsets.UTF_8);
multipartEntityBuilder.setMode(HttpMultipartMode.RFC6532);//设置模式,防止传输附件到第三方系统文件名乱码
multipartEntityBuilder.seContentType(ContentType.MULTIPART_FORM_DATA);
multipartEntityBuilder.addTextBody("data", jsonString, contentTypeJson);//设置请求格式
File file1 = new File("文件路径");
File file2 = new File("文件路径");
multipartEntityBuilder.addBinaryBody("files", new FileInputStream(file1), ContentType.DEFAULT_BINARY, file1.getName());
multipartEntityBuilder.addBinaryBody("files", new FileInputStream(file2), ContentType.DEFAULT_BINARY, file2.getName());
HttpPost httpPost = new HttpPost(请求接口地址);
httpPost.setEntity(multipartEntityBuilder.build());//将构建好的请求体放到HttpPost中。
String respContent="";
try {
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
respContent = EntityUtils.toString(httpEntity,"UTF-8");
System.out.println("result:"+respContent);
} catch (Exception e) {
e.printStackTrace();
} finally {
httpPost.releaseConnection();// 释放链接
}