【问题标题】:Javamail - How to handle large attachments?Javamail - 如何处理大附件?
【发布时间】:2013-01-27 19:27:45
【问题描述】:

在 imap 上,我试图从多条消息中获取附件。 它工作正常,但如果有一个大约 20 兆字节的附件,那么它似乎卡住了,java 没有继续。

这里是问题发生的地方: 我想获取附件的内容并将其保存到字符串中:

...
MimeBodyPart attachment = (MimeBodyPart) multipart.getBodyPart(1);  
if(!Part.ATTACHMENT.equalsIgnoreCase(attachment.getDisposition())) {
    log.error("Part is not an attachment!");
} else {
    log.debug("Checking " + localFile.getName() + " with " + attachment.getFileName() + ". Attachment-Size: " + (attachment.getSize()/(1024*1024)) + " mega-bytes.");
    InputStream remoteFileIs = attachment.getInputStream();
    remoteFileContent = IOUtils.toString(remoteFileIs);  //stucked here, when attachment is large
    remoteFileIs.close();
    ...
}
...

有解决办法吗?

问候!

【问题讨论】:

    标签: smtp imap jakarta-mail attachment large-files


    【解决方案1】:

    IOUtils.toString 有什么作用?由于您只是给它一个 InputStream,没有字符集信息,因此它不可能正确地将字节流转换为字符。无论它在做什么,它都可能对大数据效率低下。

    您可以在JavaMail Session debugging and see the protocol trace 获取附件时打开它,以确定它是真的“卡住”还是慢了。

    您还可以通过设置mail.imap.fetchsize property 来控制从 IMAP 服务器提取的缓冲区大小。

    但也许您应该质疑您是否真的想要一个 20MB 的字符串附件。拥有该字符串后,您将如何处理它?

    【讨论】:

    • 现在可以使用了。我将获取设置为 props.put("mail.imaps.fetchsize","22020096");这是21MB。那样可以么? fetch-size 过大有什么不好的地方吗?
    • 您将使用更多内存,并且您必须等待整个部分下载后才能处理它。但是,您对 IOUtils.toString 的使用也是如此。
    • @Dave 您不需要获取大小与附件一样大。它应该是一个合理的“块”,设置一个可以在短时间内下载的目标大小。我建议小于 2mb。
    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2019-07-20
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多