You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Apache CXF JAX-RS向接收多部件附件的外部REST API发送Base64编码字符串

解决Apache CXF JAX-RS发送Base64编码PDF附件的流写入错误

问题原因

直接将Base64编码字符串作为Attachment的对象,同时手动设置Content-Transfer-Encoding: base64会导致CXF处理输出流时冲突:Base64字符串本身是文本格式,CXF会尝试对其再次进行Base64编码,或无法正确识别二进制内容,最终抛出"Error writing MIME multipart body part to output stream."错误。

解决方案

核心是将Base64字符串解码为二进制字节数组后传入Attachment,由CXF自动处理编码逻辑,步骤如下:

  • 解码Base64字符串为字节数组:PDF是二进制文件,需以字节形式传递给Attachment。
  • 移除手动设置的传输编码头:CXF会自动处理multipart的编码,无需手动指定Content-Transfer-Encoding。
  • 修正ContentDisposition的引号格式:确保参数值的引号正确转义。

修改后的代码示例

import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.AttachmentBuilder;
import org.apache.cxf.jaxrs.ext.multipart.ContentDisposition;
import java.util.Base64;

// 修复URL拼写错误(原代码为http//,改为http://)
WebClient client = WebClient.create("http://External_URI");
client.type("multipart/form-data");

String base64Request = "JVBERi0xLjQKJaqrrK0KMSAwIG9iago8PAovQ3JlYXRvciAoQXBhY2hlIEZPUCBWZXJzaW9uIDIuNykKL1Byb2R1Y2VyIChBcGFjaGUgRk9QIFZlcnNpb24gMi4................";

// 将Base64字符串解码为PDF二进制字节数组
byte[] pdfBytes = Base64.getDecoder().decode(base64Request);

// 构建正确的Attachment
final Attachment att = new AttachmentBuilder()
    .id("notice")
    .object(pdfBytes) // 传入二进制字节数组而非Base64字符串
    .mediaType("application/pdf")
    .contentDisposition(new ContentDisposition("form-data; name=\"notice\"; filename=\"notice.pdf\""))
    .build();

client.post(att);

补充说明

  • 若使用Java 8之前的版本,可替换解码逻辑为Apache Commons Codec的Base64实现:
    import org.apache.commons.codec.binary.Base64;
    byte[] pdfBytes = Base64.decodeBase64(base64Request);
    
  • 原代码中URL的http//是拼写错误,需修正为http://,否则会导致连接失败。

内容的提问来源于stack exchange,提问作者mpatel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:35:21