2010-05-04 2 views
2

Я пытаюсь получить содержимое base64 MimePart в MimeMultiPart, но я борюсь с пакетом Javamail. Я просто хочу, чтобы строка с кодировкой base64 определенного встроенного изображения, однако, похоже, что это простой способ сделать это. Я написал метод, который будет принимать mime-контент (как строку) и имя изображения в качестве параметра, и ищет часть, содержащую содержимое base64 этого имени изображения, и в конце возвращает эту строку base64 (также как тип содержимого, но это не имеет никакого отношения к этому вопросу)Получение base64 строки содержимого изображения из mimepart в Java

Вот соответствующий код (в том числе соответствующего импорта):

import javax.activation.DataSource; 
import javax.mail.MessagingException; 
import javax.mail.Part; 
import javax.mail.internet.MimeMultipart; 
import javax.mail.internet.MimePart; 
import javax.mail.util.ByteArrayDataSource; 
import org.apache.commons.codec.binary.Base64; 
import org.apache.commons.io.IOUtils; 
import com.sun.mail.util.BASE64DecoderStream; 



private static String[] getBase64Content(String imageName, String mimeString) throws MessagingException, IOException 
{ 
    System.out.println("image name: " + imageName + "\n\n"); 
    System.out.println("mime string: " + mimeString); 

    String[] base64Content = new String[2]; 
    base64Content[0] = ""; 
    base64Content[1] = "image/jpeg"; //some default value 

    DataSource source = new ByteArrayDataSource(new ByteArrayInputStream(mimeString.getBytes()), "multipart/mixed"); 
    MimeMultipart mp = new MimeMultipart(source); 

    for (int i = 0; i < mp.getCount(); i++) 
    { 
    MimePart part = (MimePart) mp.getBodyPart(i); 
    String disposition = part.getDisposition(); 
    if (disposition != null && disposition.equals(Part.INLINE)) 
    { 
    if (part.getContentID() != null && part.getContentID().indexOf(imageName) > -1) //check if this is the right part 
    { 
    if (part.getContent() instanceof BASE64DecoderStream) 
    { 
     BASE64DecoderStream base64DecoderStream = (BASE64DecoderStream) part.getContent(); 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(base64DecoderStream, writer); 
     String base64decodedString = writer.toString(); 
     byte[] encodedMimeByteArray = Base64.encodeBase64(base64decodedString.getBytes()); 
     String encodedMimeString = new String(encodedMimeByteArray); 
     System.out.println("encoded mime string: " + encodedMimeString); 
     base64Content[0] = encodedMimeString; 
     base64Content[1] = getContentTypeString(part); 
    } 
    } 
    } 
    } 
    return base64Content; 
} 

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

image name: [email protected] 

Это часть ввода mimeString, он не найдет это (правильную) часть с именем изображения:

--_004_225726A14AF9134CB538EE7BD44373A04D9E3F3940menexch2007ex_ 
Content-Type: image/gif; name="image001.gif" 
Content-Description: image001.gif 
Content-Disposition: inline; filename="image001.gif"; size=1070; 
creation-date="Fri, 02 Apr 2010 16:19:43 GMT"; 
modification-date="Fri, 02 Apr 2010 16:19:43 GMT" 
Content-ID: <[email protected]> 
Content-Transfer-Encoding: base64 

R0lGODlhEAAQAPcAABxuHJzSlDymHGy2XHTKbITCdNTu1FyqTHTCXJTKhLTarCSKHEy2JHy6bJza 
lITKfFzCPEyWPHS+XHzCbJzSjFS+NLTirBx6HHzKdOz27GzCZJTOjCyWHKzWpHy2ZJTGhHS+VLzi 
(more base64 string here that I'm not going to paste) 

Но когда он, наконец, выводит закодированную строку мима, это другая строка, чем я ожидал:

encoded mime string: R0lGODlhEAAQAO+/vQAAHG4c77+90pQ877+9HGzvv71cdO+/vWzvv73vv71077+977+977+9XO+/vUx077+9XO+/vcqE77+92qwk77+9HEzvv70kfO+/vWzvv73alO+ 

Понятно отличается от того, который имеет свой выход в части выше. Я даже не уверен, что я здесь просматриваю, но когда я пытаюсь загрузить это как изображение на html-странице, это не сработает.

Это довольно неприятно для меня, так как все, что я хочу, это часть текста, которую я уже печатаю, но мне бы не пришлось самостоятельно искать строку mime для правильной части, представляя все виды ошибок. Поэтому я бы предпочел использовать библиотеку Javamail, но мог бы использовать некоторую помощь в том, как на самом деле получить правильную строку mime.

ответ

5

решаемые мой вопрос, модифицированный код:

if (part.getContent() instanceof BASE64DecoderStream) 
{ 
    BASE64DecoderStream base64DecoderStream = (BASE64DecoderStream) part.getContent(); 
    byte[] byteArray = IOUtils.toByteArray(base64DecoderStream); 
    byte[] encodeBase64 = Base64.encodeBase64(byteArray); 
    base64Content[0] = new String(encodeBase64, "UTF-8"); 
    base64Content[1] = getContentTypeString(part); 
} 

И теперь он показывает изображение просто отлично.

+0

Чтобы избежать неожиданностей/путаницы, я бы избегал использования имени метода в качестве имени переменной, как и для 'encodeBase64'. – bluish

+1

Да, вы правы, не знаете, как это проскользнуло. Возможно, наберите encodedBase64. –