spring Thymeleaf未在Sping Boot 应用程序中显示base64字符串中的图像

91zkwejq  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(142)

我有一个Sping Boot 应用程序,我使用Thymeleaf在前端显示作为base64字符串接收的图像。然而,尽管将base64字符串传递给Thymeleaf,但图像不会显示。并且此Thymeleaf模板是通过邮件发送的
下面是我的代码的简化版本:
1.我有一个“TaskDto”类,它有一个“byte[]”类型的字段“assignedToLogo”和一个对应的字段"assignedToLogoString“作为”base64“表示。

@Data

    @EqualsAndHashCode(callSuper = false)

    public class TaskDto extends BaseDto {

    private byte[] assignedToLogo;
    private String assignedToLogoString;
    private String assignedToName;
    }

字符串
2.我正在使用Thymeleaf浏览任务列表(todayitems),并尝试显示相关的图像:

<!-- Thymeleaf template in HTML -->
    <div th:each="item : ${todayitems}">
    <span>
    <img th:src="${item.assignedToLogoString}" style="height: 25px;">
    <span style="margin-left: 4px;">
    <span th:text="${item.assignedToName}"></span>
    </span>
    </span>
    </div>


3.“convert”方法正在将“assignedToLogo”从“byte[]”转换为“base64”字符串:

@Service

public class EmailGeneratorService {

@Value("${send.notification.mail.template.name1}")
private String SEND_NOTIFICATION_TEMPLATE_NAME;

@Autowired
private ProjectClient projectClient;

@Autowired
private ResourceLoader resourceLoader;

@Autowired
private JavaMailSender javaMailSender;

@Autowired
private TemplateEngine templateEngine;

public void sendMailTemplate(UserDto userDto) {
    Mail emailRequest = new Mail();
    String[] email = new String[] { userDto.getEmail() };
    emailRequest.setTo(email);
    emailRequest.setSubject("Test Email");
    emailRequest.setContent("This is the content of the email. You can use HTML if needed.");

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    
    ResponseEntity<ApiResponse> res = projectClient.getTodaysTaskFromAllProjectsForMail(Utils.getLongValueFromEncryptedString(userDto.getId()),
            userDto.getRole().name());
    List<TaskDto> allTasksOfToday = mapper.convertValue(res.getBody().getData(), new TypeReference<List<TaskDto>>() {});
    List<TaskDto> todaysTask = convert(allTasksOfToday);

    try {
        javax.mail.internet.MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,
                MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, StandardCharsets.UTF_8.name());

        // Thymeleaf template processing
        Context context = initializeThymeleafContext(emailRequest,todaysTask);

        String emailTemplate = templateEngine.process(SEND_NOTIFICATION_TEMPLATE_NAME, context);
        mimeMessageHelper.setText(emailTemplate, true);
        javaMailSender.send(mimeMessage);
        } catch (Exception e) {
        throw new RuntimeException("Failed to send email: " + e.getMessage());
    }

}

private Context initializeThymeleafContext(Mail emailRequest,List<TaskDto> todaysTask) {
    Context context = new Context();
    context.setVariable("emailContent", emailRequest.getContent());
    context.setVariable("todayitems", todaysTask);
    return context;
}

private static List<TaskDto> convert(List<TaskDto> taskDtos) {
    
    for (TaskDto task : taskDtos) {

        //task.getAssignedToLogo is in byte form.
        String base64Logo = Base64.getEncoder().encodeToString(task.getAssignedToLogo());
        System.out.println(base64Logo);
        task.setAssignedToLogoString(base64Logo);
    }
    return taskDtos;
}


发行日期:
尽管实现了将assignedToLogo转换为base64字符串并将其传递给Thymeleaf,但图像不会显示在前端。
附加上下文:
我已经验证了base64字符串是正确生成的。浏览器控制台中没有错误。我正在使用Thymeleaf和Sping Boot 进行模板渲染。
问:
有人能帮我找出代码中的问题吗?或者提供如何解决和修复此问题的建议?我在Thymeleaf模板或Java代码中缺少了什么吗?
任何帮助将不胜感激!

zour9fqk

zour9fqk1#

请确保您的assignedLogoToString有**“data:image/jpg;base64 "**前缀,如果没有,请将其添加到您的Java代码中,

task.setAssignedToLogoString("data:image/jpg;base64,"+base64Logo);

字符串
或者你可以将它添加到你的Thymeleaf模板中:

<img th:src="data:image/jpg;base64,${item.assignedToLogoString}" style="height: 25px;">


我更喜欢把它添加到thymeleaf模板。

相关问题