我有一个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代码中缺少了什么吗?
任何帮助将不胜感激!
1条答案
按热度按时间zour9fqk1#
请确保您的assignedLogoToString有**“data:image/jpg;base64 "**前缀,如果没有,请将其添加到您的Java代码中,
字符串
或者你可以将它添加到你的Thymeleaf模板中:
型
我更喜欢把它添加到thymeleaf模板。