java邮件Base64编码字符串到图像附件

时间:2015-03-11 08:31:40

标签: java javamail

我有一个base64编码的字符串,它使用JSON发布到Spring表单中。

data:image/png;base64,iVBORw0KGg......etc

我想将此图片添加为电子邮件的附件。附加文件工作正常,但它只是添加base64字符串作为附件。

我使用以下代码创建附件部分。

private MimeBodyPart addAttachment(final String fileName, final String fileContent) throws MessagingException {

    if (fileName == null || fileContent == null) {
        return null;
    }

    LOG.debug("addAttachment()");

    MimeBodyPart filePart = new MimeBodyPart();

    String data = fileContent;
    DataSource ds;
    ds = new ByteArrayDataSource(data.getBytes(), "image/*");

    // "image/*"
    filePart.setDataHandler(new DataHandler(ds));
    filePart.setFileName(fileName);

    LOG.debug("addAttachment success !");

    return filePart;

}

我也试过

 ds = new ByteArrayDataSource(data, "image/*");

如何使用ByteArrayDataSource将base64字符串转换为正确的图像文件?

5 个答案:

答案 0 :(得分:6)

您首先要使用Base64解码器。使用Java 8,您可以:

byte[] imgBytes = Base64.getDecoder().decode(base64String);

对于较旧的java版本,你必须使用像apache commons-codec这样的库或其他东西 - 周围有很多这样的库。

答案 1 :(得分:5)

为避免解码和重新编码,您可以使用javax.mail.internet.PreencodedMimeBodyPart加载base64字符串并将PreencodedMimeBodyPart附加到您的邮件中。

    private MimeBodyPart addAttachment(final String fileName, final String fileContent) throws MessagingException {
        if (fileName == null || fileContent == null) {
            return null;
        }

        LOG.debug("addAttachment()");
        MimeBodyPart filePart = new PreencodedMimeBodyPart("base64");
        filePart.setContent(fileContent, "image/*");
        LOG.debug("addAttachment success !");
        return filePart;
    }

否则,您可以使用javax.mail.internet.MimeUtility::decode来包装与数据源一起使用的输入流,但这会对给定数据进行解码和重新编码。

    private MimeBodyPart addAttachment(final String fileName, final String fileContent) throws MessagingException {
        if (fileName == null || fileContent == null) {
            return null;
        }

        LOG.debug("addAttachment()");
        MimeBodyPart filePart = new MimeBodyPart();

        String data = fileContent;
        DataSource ds;  //Assuming fileContent was encoded as UTF-8.
        InputStream in = new ByteArrayInputStream(data.getBytes("UTF-8"));
        try {
            in = MimeUtility.decode(in, "base64");
            try {
                ds = new ByteArrayDataSource(in , "image/*");
            } finally {
                in.close();
            }
        } catch (IOException ioe) {
            throw new MessagingException(fileName, ioe);
        }

        // "image/*"
        filePart.setDataHandler(new DataHandler(ds));
        filePart.setFileName(fileName);

        LOG.debug("addAttachment success !");
        return filePart;
    }

答案 2 :(得分:1)

 // v = data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA........................
String body = v.replace("data:image/png;base64","");                                    
MimeBodyPart filePart = new PreencodedMimeBodyPart("base64");
filePart.setFileName("screenshot.png");
//This is Needed if you want to show as an html element in the page
filePart.setHeader("Content-ID", "<screenshot>");
filePart.setText(body);
message.getMimeMultipart().addBodyPart(filePart);

答案 3 :(得分:0)

我遇到了同样的问题,我可以使用此代码修复它:

//你必须首先解析数据以删除&#34; data:image / png; base64&#34;在使用decodeBase64(数据)之前。

byte[] imgBytes = Base64.decodeBase64(data);
ByteArrayDataSource dSource = new ByteArrayDataSource(imgBytes, "image/*");

答案 4 :(得分:0)

使用@jmehrens的答案,我可以附加一个文件,但是无法打开它们。原来,您需要分别设置数据类型并将其从给定的fileContent字符串中删除:

{
   String dataType = StringUtils.substringBetween(file, "data:", ";base64,"); // extract data type (dataType = "image/png") 
base64EncodedFileContent = fileContent.replaceFirst("data:.*;base64,", ""); // remove prefix from fileContent String (base64EncodedFileContent = "iVBORw0KGg......etc"

    MimeBodyPart filePart = new PreencodedMimeBodyPart("base64");
    filePart.setContent(base64EncodedFileContent, dataType);
    filePart.setFileName(fileName);

    return filePart;
 }