Thymeleaf自定义属性下避免base64换行符转义的问题咨询
问题:Thymeleaf处理SVG模板时base64图片换行符被转义
我在使用Thymeleaf处理SVG模板,替换base64编码的嵌入式图片时遇到了问题。
原始标签代码如下:
<image width="100" height="100" id="image123" x="0" y="0" preserveAspectRatio="none" th:attr="'xlink:href'='data:image/png;base64,' + ${imageBase64}" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAAAXNSR0IArs4c6QAAAARnQU1BAACx jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAoRSURBVHhe7d09cts6FAVg663FSuHxCqgVyG5c <MORE BASE64 DATA HERE...> ggUqECxQgWCBCgQLVCBYoALBAhUIFqhAsEAFggUqECxQgWABwFicnf0PDRO+cnclXPUAAAAASUVO RK5CYII= " />
我使用的base64编码的图片数据每行包含76个字符加一个换行符(LF),需要保留这个结构,因为部分SVG渲染器遇到超长行时会解析失败。
当前遇到的问题是:当我将带换行符的base64字符串赋值给上下文变量imageBase64时,Thymeleaf会将LF字符转义为
,这会直接导致base64解码器无法正常工作。
我知道针对标签内文本可以使用th:utext属性避免转义,但在使用自定义属性时,有没有方法可以避免内容转义?
解答
你可以用Thymeleaf内置的无转义内联表达式直接解决这个问题,不需要额外扩展配置,步骤如下:
- 把原来的
th:attr属性替换为直接给xlink:href赋值的写法,使用[(...)]包裹你要输出的变量,这个语法的作用就是原样输出内容不做任何HTML转义:
<image width="100" height="100" id="image123" x="0" y="0" preserveAspectRatio="none" th:xlink:href="|data:image/png;base64,[( ${imageBase64} )]|" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAAAXNSR0IArs4c6QAAAARnQU1BAACx jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAoRSURBVHhe7d09cts6FAVg663FSuHxCqgVyG5c <MORE BASE64 DATA HERE...> ggUqECxQgWCBCgQLVCBYoALBAhUIFqhAsEAFggUqECxQgWABwFicnf0PDRO+cnclXPUAAAAASUVO RK5CYII= " />
这里的|...|是Thymeleaf的字面量拼接语法,比普通字符串拼接写法更简洁。
2. 如果你有大量同类需要不转义输出属性的场景,也可以自定义Thymeleaf属性处理器,针对xlink:href这类属性跳过默认的转义逻辑,直接输出原始值,不过绝大多数场景下第一种方法就足够用了。
内容的提问来源于stack exchange,提问作者Ultranium
相关产品推荐
相关产品推荐

