2010-05-04 14 views
2

J'essaie d'obtenir le contenu base64 d'un MimePart dans un MimeMultiPart, mais je suis aux prises avec le paquet Javamail. Je veux simplement la chaîne encodée en base64 d'une certaine image en ligne, il ne semble pas y avoir de moyen facile de le faire. J'ai écrit une méthode qui prendra le contenu mime (comme une chaîne) et un nom d'image comme un paramètre, et recherche la partie qui contient le contenu base64 de ce nom d'image, et à la fin renvoie cette chaîne base64 (ainsi comme le type de contenu, mais qui est hors de propos pour cette question)Obtention d'une chaîne de contenu base64 d'une image à partir d'un mimepart en Java

Voici le code correspondant (y compris les importations pertinentes):

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; 
} 

Je ne peux pas coller toute la production que le poste serait trop long, mais c'est une partie:

image name: [email protected] 

Ceci est une partie de l'entrée mimeString, il trouve cela (correct) partie avec le nom de l'image:

--_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) 

Mais quand il imprime enfin la chaîne de mime codé, c'est une autre chaîne que je me attendais:

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

Clairement différent de celui qui a sa sortie dans la partie ci-dessus. Je ne suis même pas sûr de ce que je regarde ici, mais quand j'essaye de charger ceci comme image dans une page de HTML, cela ne fonctionnera pas.

Ceci est assez frustrant pour moi, puisque tout ce que je veux, c'est un morceau du texte que j'imprime déjà, mais je préfère ne pas chercher moi-même la corde mime pour la partie correcte, en présentant toutes sortes Donc, je préfère vraiment utiliser la bibliothèque Javamail, mais je pourrais utiliser de l'aide sur la manière d'obtenir cette chaîne mime correcte.

Répondre

5

résolu mon problème, le code modifié pour:

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

Et maintenant il est d'afficher l'image très bien.

+0

Pour éviter les surprises/la confusion, j'éviterais d'utiliser un nom de méthode comme nom de variable, comme c'est le cas avec 'encodeBase64'. – bluish

+1

Ouais vous avez raison, je ne sais pas comment cela s'est glissé. Probablement ment pour taper encodedBase64. –