因此,我有一个表单,允许用户上传一个图像,它将被编码为IOUtils.toByteArray,并作为一个字节持久化到数据库。在一个控制器方法中,我得到这个字节数组并将其编码为字符串:
@GetMapping("/{user_id}")
public String view(@PathVariable("user_id") Long user_id, Model model) {
User user = userService.getById(user_id);
model.addAttribute("user", user);
byte[] profilePictureBytes = user.getProfilePicture();
if (profilePictureBytes != null) {
String encodedImage = Base64.getEncoder().encodeToString(profilePictureBytes);
model.addAttribute("encodedImage", encodedImage);
}
return "user-page";
}
在一个用户页面的html文件中,我尝试像这样解码它:
<img th:attr="src=${'data:image/jpeg;base64,' + encodedImage}" alt="Profile Picture">
此解决方案适用于较小的图像,但当编码图像超过100 000个字符时会引发异常:
org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "'data:image/jpeg;base64,' + encodedImage" (template: "user-page" - line 27, col 6)
org.springframework.expression.spel.SpelEvaluationException: EL1078E: Concatenated string is too long, exceeding the threshold of '100 000' characters
有没有办法绕过这个限制,或者我应该改变整个程序的逻辑?谢谢大家。
1条答案
按热度按时间wqlqzqxt1#
这一个是棘手的!TY,@Andrey(,再次;)用于准确地指出“问题”。我不确定,是否值得为此打开一个 Spring 问题/请求/增强。
但是:
th:attrappend
!!;)(而不是Spring EL string concat;)生成的模板:
(测试)使用的控制器:
一般
这些类型的东西属于负载均衡器的缓存!(..而不是进入你的“后端”的“内存”(
byte[], Base64
...):)高级
将这些(类似于)东西(附加到html/http响应)类似于https://www.thymeleaf.org/doc/articles/springmail.html,就像:
MimeMessage
addInline
)另一种(简单)解决方法
...提供完整的属性值,而不是“base64部分”。
然后模板看起来像:
(我也尝试了模板SpEL
th:attr="src=${#T(java.lang.String).format('data:image/jpeg;base64,%s', encodedImageAttr)}"
,但失败了,因为:)