java mail Base64 encoded string to image attachment

后端 未结 5 2031
旧巷少年郎
旧巷少年郎 2020-12-21 08:38

I have a base64 encoded string which is posted using JSON into a Spring form.

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

I want to add this

相关标签:
5条回答
  • 2020-12-21 09:24

    With the answer of @jmehrens I was able to attach a file, but they couldn't be opened. Turned out you need to set the datatype seperately and remove it from the given fileContent String:

    {
       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;
     }
    
    0 讨论(0)
  • 2020-12-21 09:34

    You'll hav to use a Base64-decoder first. With Java 8 you could do:

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

    With older java-versions you'll have to use some library like apache commons-codec or something - there's lots of those around.

    0 讨论(0)
  • 2020-12-21 09:37

    i encounter the same issue and I was able to fix it using this code:

    //you have to parse the data first to remove "data:image/png;base64" before you can use the decodeBase64(data).

    byte[] imgBytes = Base64.decodeBase64(data);
    ByteArrayDataSource dSource = new ByteArrayDataSource(imgBytes, "image/*");
    
    0 讨论(0)
  • 2020-12-21 09:40
     // 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);
    
    0 讨论(0)
  • 2020-12-21 09:42

    To avoid decoding and re-encoding you can use the javax.mail.internet.PreencodedMimeBodyPart to load your base64 string and attach the PreencodedMimeBodyPart to your message.

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

    Otherwise, you can use the javax.mail.internet.MimeUtility::decode to wrap the input stream used with your data source but this will decode and re-encode the given data.

        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;
        }
    
    0 讨论(0)
提交回复
热议问题