如何通过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
相关产品推荐
相关产品推荐

