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();// 释放链接
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值