2013-02-12 2 views
0

Над imap im пытается получить вложения из нескольких сообщений. Он работает нормально, но если есть вложение с 20 мегабайтами, то он кажется застрявшим, и java не продолжается.Javamail - Как обрабатывать большие вложения?

Вот где проблема возникает: Я хочу, чтобы получить содержимое вложения и сохранить его в строку:

... 
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(); 
    ... 
} 
... 

Существует ли какое-либо решение этого?

С уважением!

ответ

1

Что делает IOUtils.toString? Поскольку вы просто даете ему InputStream, без информации о кодировке, он не может преобразовать поток байтов в символы должным образом. И что бы это ни было, это может сделать это неэффективно для больших данных.

Вы можете включить JavaMail Session debugging and see the protocol trace, поскольку он выбирает приложение, чтобы определить, действительно ли оно «застряло» или просто медленно.

Вы также можете управлять размером буфера для изъятий с сервера IMAP, установив mail.imap.fetchsize property.

Но, возможно, вам стоит задать вопрос, действительно ли вы действительно хотите вложение 20 Мб в строку. Что вы собираетесь делать с этой Строкой, как только вы ее получите?

+0

Теперь он работает. Я установил выборку для props.put ("mail.imaps.fetchsize", "22020096"); который составляет 21 МБ. Это нормально? Есть ли недостатки, если размер выборки слишком велик? –

+0

Вы будете использовать больше памяти, и вам придется дождаться загрузки всей части, прежде чем вы сможете ее обработать. Но все это было верно для вашего использования IOUtils.toString. –

+0

@ Дайте вам размер выборки, размер которого не больше, чем вложение. это должен быть разумный «кусок», установить целевой размер, который будет загружен в течение короткого периода времени. я бы предложил менее 2 мб. – pstanton

Смежные вопросы