场景

发送邮件的时候,希望在邮件中放一张图片。

如果可以直接引用链接就会很方便,但是想简单点,因为图片非常小。

java 实现

转换方法

    /**
     * 将文件转成 base64 字符串
     *
     * https://www.cnblogs.com/darkhumor/p/7525392.html
     * https://blog.csdn.net/phoenix_cat/article/details/84676302
     * https://blog.csdn.net/myloverisxin/article/details/117530365
     * https://www.cnblogs.com/yejg1212/p/11926649.html
     *
     * 不同规范编码不同,会导致出现换行符号,但是解码的时候会被忽略。
     * @param filePath 文件路径
     * @return base64 字符串
     * @since 0.1.146
     */
    public static String fileToBase64(String filePath) {
        File file = new File(filePath);

        try(FileInputStream inputFile = new FileInputStream(file)) {
            byte[] buffer = new byte[(int)file.length()];
            inputFile.read(buffer);
            String plainText = Base64.getEncoder().encodeToString(buffer);

            return plainText.replaceAll("\r", "")
                    .replaceAll("\n", "");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

使用例子

HTML 中如何使用 base64

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Base64 Image Example</title>
</head>
<body>

    <!-- 假设这是你图片的Base64编码 -->
    <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/..." alt="Base64 Image">

</body>
</html>

如何解决?

Java如何在发送邮件时添加图片

在Java中发送带有图片的邮件,你可以使用JavaMail API,这是Java的一个邮件处理库。

以下是添加图片到邮件的基本步骤:

  1. 添加依赖:首先,确保你的项目中包含了JavaMail库。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

     <dependency>
         <groupId>com.sun.mail</groupId>
         <artifactId>javax.mail</artifactId>
         <version>1.6.2</version>
     </dependency>
    
  2. 创建邮件会话:使用javax.mail.Session创建一个邮件会话。

     Properties props = new Properties();
     props.put("mail.smtp.auth", "true");
     props.put("mail.smtp.starttls.enable", "true");
     props.put("mail.smtp.host", "smtp.example.com");
     props.put("mail.smtp.port", "587");
    
     Session session = Session.getInstance(props, new javax.mail.Authenticator() {
         protected PasswordAuthentication getPasswordAuthentication() {
             return new PasswordAuthentication("yourEmail@example.com", "yourPassword");
         }
     });
    
  3. 创建邮件消息:使用session创建一个MimeMessage对象。

     MimeMessage message = new MimeMessage(session);
    
  4. 设置邮件属性:设置发件人、收件人、主题等。

     message.setFrom(new InternetAddress("yourEmail@example.com"));
     message.addRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com"));
     message.setSubject("Test email with image");
    
  5. 添加图片:创建一个MimeBodyPart来包含图片,并将其添加到邮件中。

     MimeBodyPart textPart = new MimeBodyPart();
     textPart.setText("This is a test email with an image.");
    
     MimeBodyPart imagePart = new MimeBodyPart();
     DataSource fds = new FileDataSource("path/to/your/image.jpg");
     imagePart.setDataHandler(new DataHandler(fds));
     imagePart.setHeader("Content-ID", "<image1>");
     imagePart.setDisposition(MimeBodyPart.INLINE);
    
     Multipart multipart = new MimeMultipart();
     multipart.addBodyPart(textPart);
     multipart.addBodyPart(imagePart);
    
     message.setContent(multipart);
    
  6. 发送邮件:使用Transport发送邮件。

     Transport transport = session.getTransport("smtp");
     transport.connect("smtp.example.com", "yourEmail@example.com", "yourPassword");
     transport.sendMessage(message, message.getAllRecipients());
     transport.close();
    

请注意,你需要替换上述代码中的yourEmail@example.com, yourPassword, recipient@example.com, smtp.example.com, path/to/your/image.jpg等为实际的值。

此外,确保你有权访问指定的图片文件,并且邮件服务器允许发送带有附件的邮件。

如何直接获取一张图片的base64?

要直接获取一张图片的Base64编码,你可以使用Java的java.util.Base64类来实现。以下是一个简单的步骤和示例代码:

  1. 读取图片文件:使用java.io.Filejava.io.FileInputStream读取图片文件。

  2. 转换为字节数组:将图片文件转换为字节数组。

  3. 使用Base64编码:使用java.util.Base64类对字节数组进行编码。

  4. 获取Base64字符串:编码后的结果是一个字节数组,将其转换为字符串。

以下是具体的示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Base64;

public class ImageToBase64 {
    public static void main(String[] args) {
        String imagePath = "path/to/your/image.jpg"; // 图片文件路径
        File imageFile = new File(imagePath);
        try (FileInputStream imageInFile = new FileInputStream(imageFile)) {
            // 读取图片文件到字节数组
            byte[] imageData = new byte[(int) imageFile.length()];
            imageInFile.read(imageData);

            // 使用Base64编码字节数组
            String base64Image = Base64.getEncoder().encodeToString(imageData);

            // 输出Base64编码后的字符串
            System.out.println("Base64 Encoded Image: " + base64Image);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这段代码将读取指定路径的图片文件,将其转换为Base64编码的字符串,并打印出来。

请注意,你需要将path/to/your/image.jpg替换为实际的图片文件路径。

此外,如果你需要将Base64编码的图片直接嵌入到HTML或CSS中,你可能需要确保Base64字符串是有效的,并且可能需要添加适当的前缀(如data:image/jpeg;base64,)来指示这是一个图片数据。

如何在 html 中用 base64 方式显示图片?

在HTML中使用Base64编码显示图片,你可以将图片的Base64编码直接嵌入到<img>标签的src属性中。这样做的好处是不需要从服务器请求图片文件,图片会直接嵌入到HTML文档中。下面是具体的做法:

  1. 获取图片的Base64编码:首先,你需要将图片文件转换成Base64编码,如之前所述。

  2. 创建HTML标签:使用<img>标签,并设置src属性为图片的Base64编码字符串。确保Base64字符串前有正确的前缀,例如data:image/jpeg;base64,,其中image/jpeg是图片的MIME类型,根据你的图片类型(如PNG、GIF等)进行相应的更改。

下面是一个示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Base64 Image Example</title>
</head>
<body>

    <!-- 假设这是你图片的Base64编码 -->
    <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/..." alt="Base64 Image">

</body>
</html>

请注意,Base64编码的字符串通常会很长,因此你需要确保正确地获取和嵌入整个字符串。

另外,由于Base64编码增加了大约33%的大小,对于较大的图片,这可能会导致HTML文件的大小显著增加,从而影响页面加载速度。

因此,使用Base64编码的图片适用于小图标或小图片,对于较大的图片,最好是使用常规的图片文件路径。

参考资料

https://blog.csdn.net/u011456337/article/details/86180383

github项目地址:https://github.com/lufei222/san-holiday.git