当前位置: 首页 > 知识库问答 >
问题:

Thymeleaf不会将所有图标附加到模板

华建同
2023-03-14

当我试图在模板上生成带有图标的电子邮件时,我遇到了Thymeleaf的问题。我已经按照留档建议的步骤进行了操作,请参见第4.3部分,但在电子邮件中,只显示了3个图标中的2个。

首先我加载图标:

private byte[] loadImage(String path, String extension) {
    byte[] image = new byte[0];

    try {
        URL file = getClass().getClassLoader().getResource(path);
        BufferedImage buffer = ImageIO.read(file);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(buffer, extension, outputStream);
        image = outputStream.toByteArray();
    } catch (IOException exception) {
        log.debug(exception.getLocalizedMessage());
    }

然后我将图标添加到mimessagehelper

private void attachIcons(MimeMessageHelper message) {
    try {
        byte[] logoIconInBytes = loadImage(LOGO_ICON_PATH, "png");
        InputStreamSource logoImageSource = new ByteArrayResource(logoIconInBytes);
        message.addInline(LOGO_IMAGE_RESOURCE, logoImageSource, IMAGE_CONTENT_TYPE);
        byte[] phoneIconInBytes = loadImage(PHONE_ICON_PATH, "png");
        InputStreamSource phoneImageSource = new ByteArrayResource(phoneIconInBytes);
        message.addInline(PHONE_IMAGE_RESOURCE, phoneImageSource, IMAGE_CONTENT_TYPE);
        byte[] emailIconInBytes = loadImage(EMAIL_ICON_PATH, "png");
        InputStreamSource emailImageSource = new ByteArrayResource(emailIconInBytes);
        message.addInline(EMAIL_IMAGE_RESOURCE, emailImageSource, IMAGE_CONTENT_TYPE);
    } catch (MessagingException exception) {
        log.debug(exception.getLocalizedMessage());
    }
}

在哪里:

private static final String LOGO_ICON_PATH = "data" + File.separator + "logo_example.png";
private static final String PHONE_ICON_PATH = "data" + File.separator + "phone.png";
private static final String EMAIL_ICON_PATH = "data" + File.separator + "email.png";
private static final String IMAGE_CONTENT_TYPE = "image/png";

然后,在发送电子邮件之前,我在上下文中设置变量:

......
context.setVariable(LOGO_IMAGE_RESOURCE, LOGO_IMAGE_RESOURCE);
context.setVariable(PHONE_IMAGE_RESOURCE, PHONE_IMAGE_RESOURCE);
context.setVariable(EMAIL_IMAGE_RESOURCE, EMAIL_IMAGE_RESOURCE);
String content = templateEngine.process(templateName, context);
......

在模板上,我分别调用

....
<img class="resize" th:src="|cid:${logoIcon}|" alt="Test">
....
<td class="someCssClass"> <img th:src="|cid:${phoneIcon}|" alt="phone"> </td>
<td class="someCssClass"> <img th:src="|cid:${emailIcon}|" alt="email"> </td>
....

但是电子邮件图标没有显示,我用Firefox开发工具检查DOM时发现:

您可以看到徽标和手机图标已附加,但电子邮件图标未附加。

我改变了我的想法,认为可能是文件被破坏了,但没有改变。

问题出在哪里?

当做


共有1个答案

祁杰
2023-03-14

嗯,我偶然发现了这个问题。我不知道这是一个bug还是因为我不知道如何使用API,但这是发生的奇怪事情:

当我添加图标时:

byte[] logoIconInBytes = loadImage(LOGO_ICON_PATH, "png");
InputStreamSource logoImageSource = new ByteArrayResource(logoIconInBytes);
message.addInline(LOGO_IMAGE_RESOURCE, logoImageSource, IMAGE_CONTENT_TYPE);
byte[] phoneIconInBytes = loadImage(PHONE_ICON_PATH, "png");
InputStreamSource phoneImageSource = new ByteArrayResource(phoneIconInBytes);
message.addInline(PHONE_IMAGE_RESOURCE, phoneImageSource, IMAGE_CONTENT_TYPE);
byte[] emailIconInBytes = loadImage(EMAIL_ICON_PATH, "png");
InputStreamSource emailImageSource = new ByteArrayResource(emailIconInBytes);
message.addInline(EMAIL_IMAGE_RESOURCE, emailImageSource, IMAGE_CONTENT_TYPE);

我删除了电子邮件代码行,以便再次编写它们,以防出现任何错误。

byte[] logoIconInBytes = loadImage(LOGO_ICON_PATH, "png");
InputStreamSource logoImageSource = new ByteArrayResource(logoIconInBytes);
message.addInline(LOGO_IMAGE_RESOURCE, logoImageSource, IMAGE_CONTENT_TYPE);
byte[] phoneIconInBytes = loadImage(PHONE_ICON_PATH, "png");
InputStreamSource phoneImageSource = new ByteArrayResource(phoneIconInBytes);
message.addInline(PHONE_IMAGE_RESOURCE, phoneImageSource, IMAGE_CONTENT_TYPE);

我无意中运行了应用程序并生成了电子邮件,我注意到手机图标没有显示出来。我删除了手机图标,只加载了徽标,这次电子邮件上没有显示任何图标。

所以,解决方案是在加载所有图标后添加一个虚拟内容,以便显示。

byte[] logoIconInBytes = loadImage(LOGO_ICON_PATH, "png");
InputStreamSource logoImageSource = new ByteArrayResource(logoIconInBytes);
message.addInline(LOGO_IMAGE_RESOURCE, logoImageSource, IMAGE_CONTENT_TYPE);
byte[] phoneIconInBytes = loadImage(PHONE_ICON_PATH, "png");
InputStreamSource phoneImageSource = new ByteArrayResource(phoneIconInBytes);
message.addInline(PHONE_IMAGE_RESOURCE, phoneImageSource, IMAGE_CONTENT_TYPE);
byte[] emailIconInBytes = loadImage(EMAIL_ICON_PATH, "png");
InputStreamSource emailImageSource = new ByteArrayResource(emailIconInBytes);
message.addInline(EMAIL_IMAGE_RESOURCE, emailImageSource, IMAGE_CONTENT_TYPE);
// Dummy content that won't be displayed to make all previous icons visible on the email
message.addInline("emptyIcon", new ByteArrayResource(new byte[0]), IMAGE_CONTENT_TYPE);
 类似资料:
  • 我有一个使用Spring Boot JPA(Spring Boot starter data JPA dependency)的项目,它使用Hibernate作为JPA实现。 我自动配置了我的容器(@EnableAutoConfiguration),并且我使用EntityManager进行CRUD操作。 问题:我在启动时使用EntityManager通过HQL查询加载实体,但当我想要编辑或删除其中任

  • 问题内容: 我想在每个页面上显示一个导航栏。在PHP中,我会编写导航栏,然后将其包含在其他页面上。我试图将导航栏模板包括或扩展到其他模板中,但是没有用。它仅输出“这是主页”。如何在每个模板中正确包含导航栏? layout.html index.html 问题答案: 使用所有页面共有的布局和导航创建基本模板。然后扩展此模板以创建实际的页面。向基本模板中添加可以在其他模板中覆盖的块。 base.htm

  • 我遇到了一个关于堆栈溢出的错误,我已经见过多次了,但是没有一个解决方案适合我。 基本上,我使用Thymeleaf 3运行Spring Boot 4,当我使用进行本地测试时,我的模板加载很好/格雷德卢·布特伦。 但是,当我打包jar并尝试运行它时,当我访问endpoint时,总是会出现以下错误: 我的模板都位于src/main/resources/templates/下,并且是以结尾的文件。html

  • 问题内容: 我想建立一个不牺牲SEO的ajax网站。我的问题是:如果我的页面上有这样的链接: …当单击每个链接时,我想用相应的标签更新地址栏。因此,如果单击“猫”链接,则当前位置为http://example.com/#cats,我可以用它来显示我的Ajax内容。如果javascript关闭或用户是搜索引擎,他们将直接转到/ cats 问题答案: 您可以更改属性,它会更改当前的锚标识符,而无需导航

  • 当我点击前端的一个链接(< code>brandname)时,我需要使用百里叶中的< code>th:href向服务器发送一个请求。为此,我遵循以下代码 和< code>brandname值动态地来自它们各自的< code >对象,但是对于上面的请求,我需要附加额外的内容,为此我尝试了下面的方法

  • 我遇到了一个问题,让我的spring boot应用程序加载我的简单网页。我已经复制了这里提供的示例,并在模板目录中实现了它们,我一直得到这个错误 TemplateInputException:解析模板[index]时出错,模板可能不存在,或者任何已配置的模板解析程序都无法访问模板 下面是文件目录 如有任何帮助,不胜感激,谢谢。