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

Java11环境下如何将javax.mail的MimeBodyPart附件转为byte[]

问题原因

你两次尝试的写法存在以下问题:

  1. 直接调用attachment.getInputStream().readAllBytes()的逻辑本身是成立的,大概率是你没有正确处理流的关闭、或者后续输出环节出现了额外的编码转换导致文件损坏。
  2. 第二种尝试的错误非常明显: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:06:03