Я пытаюсь получить содержимое base64 MimePart в MimeMultiPart, но я борюсь с пакетом Javamail. Я просто хочу, чтобы строка Base64 закодировала определенное встроенное изображение, хотя, кажется, нет простого способа сделать это.
Я написал метод, который будет принимать содержимое MIME (в виде строки) и имя изображения в качестве параметра, и ищет часть, которая содержит содержимое base64 этого имени изображения, и в конце возвращает эту строку base64 (а также тип контента, но это не имеет значения для этого вопроса)
Вот соответствующий код (включая соответствующий импорт):
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: image001.gif@01CAD280.4D637150
Это часть ввода 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: <image001.gif@01CAD280.4D637150>
Content-Transfer-Encoding: base64
R0lGODlhEAAQAPcAABxuHJzSlDymHGy2XHTKbITCdNTu1FyqTHTCXJTKhLTarCSKHEy2JHy6bJza
lITKfFzCPEyWPHS+XHzCbJzSjFS+NLTirBx6HHzKdOz27GzCZJTOjCyWHKzWpHy2ZJTGhHS+VLzi
(more base64 string here that I'm not going to paste)
Но когда он, наконец, печатает закодированную строку MIME, это другая строка, чем я ожидал:
encoded mime string: R0lGODlhEAAQAO+/vQAAHG4c77+90pQ877+9HGzvv71cdO+/vWzvv73vv71077+977+977+9XO+/vUx077+9XO+/vcqE77+92qwk77+9HEzvv70kfO+/vWzvv73alO+
Очевидно, отличается от того, который выводится в приведенной выше части. Я даже не уверен, что я смотрю здесь, но когда я пытаюсь загрузить это как изображение на html-странице, это не сработает.
Это довольно неприятно для меня, так как все, что я хочу, - это фрагмент текста, который я уже печатаю, но мне бы не пришлось самостоятельно искать нужную часть в строке mime, представляя все виды bugs.So я действительно предпочел бы использовать библиотеку Javamail, но мог бы использовать некоторую помощь о том, как на самом деле получить эту правильную строку MIME.