Java11环境下如何将javax.mail的MimeBodyPart附件转为byte[]
问题原因
你两次尝试的写法存在以下问题:
- 直接调用
attachment.getInputStream().readAllBytes()的逻辑本身是成立的,大概率是你没有正确处理流的关闭、或者后续输出环节出现了额外的编码转换导致文件损坏。 - 第二种尝试的错误非常明显:
BASE64DecoderStream本身已经是经过Base64解码的流,你从中读取到的就是附件的原始二进制字节,额外执行Base64.decodeBase64(bytes)属于重复解码,直接破坏了PDF的二进制结构,所以文件无法正常打开。
正确实现
你现有代码已经依赖了IOUtils,推荐直接复用该工具类实现,写法和你原有逻辑对齐,兼容性更好:
private void savePDF(MimeBodyPart attachment, String invoiceNumber) throws MessagingException, IOException { // getInputStream会自动处理Base64、quoted-printable等邮件传输编码的解码 byte[] data = IOUtils.toByteArray(attachment.getInputStream()); // 后续接你已有的输出逻辑即可 }
如果要使用Java 11原生实现,记得用try-with-resources自动关闭流避免资源泄漏:
private void savePDF(MimeBodyPart attachment, String invoiceNumber) throws MessagingException, IOException { try (InputStream inputStream = attachment.getInputStream()) { byte[] data = inputStream.readAllBytes(); // 后续接你已有的输出逻辑即可 } }
注意事项
- 不要对
getInputStream()读取到的字节做二次解码操作,拿到的就是附件原始二进制内容。 - 可以增加前置校验,避免读取到非PDF的内容导致无法打开:
if (Part.ATTACHMENT.equalsIgnoreCase(attachment.getDisposition()) && attachment.getFileName().toLowerCase().endsWith(".pdf")) { // 执行字节读取逻辑 }
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

