2013-02-12 2 views
0

imap에서 여러 메시지의 첨부 파일을 가져 오는 중입니다. 잘 작동하지만 약 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의 기능은 무엇입니까? charset 정보가없는 InputStream 만 제공하기 때문에 바이트 스트림을 문자로 올바르게 변환 할 수 없습니다. 그리고 무엇을 하든지간에 대용량 데이터의 경우 비효율적 일 수 있습니다.

첨부 파일을 가져올 때 JavaMail Session debugging and see the protocol trace을 켜서 실제로 멈췄는지 또는 느린지를 확인할 수 있습니다.

mail.imap.fetchsize property을 설정하여 IMAP 서버에서 가져 오기를위한 버퍼 크기를 제어 할 수도 있습니다.

그러나 아마도 이 실제로 인 경우 문자열에 20MB의 첨부 파일이 필요할지 여부를 질문해야합니다. 일단 당신이 그것을 가지고 있으면 그 String으로 무엇을 할 것입니까?

+0

이제 작동합니다. 가져 오기를 props.put ("mail.imaps.fetchsize", "22020096"); 21MB입니다. 그 확인은? 페치 크기가 너무 큰 경우 불이익이 있습니까? –

+0

더 많은 메모리를 사용하게되며 처리하기 전에 전체 부품이 다운로드 될 때까지 기다려야합니다. 하지만 IOUtils.toString을 사용할 때도 마찬가지입니다. –

+0

@ 첨부 파일 크기만큼 페치 크기가 필요하지 않습니다. 합리적인 '덩어리'여야하며 짧은 시간 내에 다운로드 할 대상 크기를 설정하십시오. 나는 2 메가 바이트보다 적은 것을 제안 할 것이다. – pstanton

관련 문제