在Freemarker模板中编码base64

5
有没有一种在Freemarker模板中将字节数组转换为base64的方法?类似于以下内容:
```<#assign base64 = byteArr?bytes?base64>```
<img src="data:image/jpeg;base64,${photo.data?base64}" />

谢谢。

1
我使用转义的引号构建了整个字符串,并在模板中用不带引号的变量替换了整个变量。像这样使用invoiceNumberBarcode: ""data:image/jpg;base64," + base64BarcodeJpg + """; 我想知道为什么人们要处理接受的答案中的混乱。 - Sean Anderson
1个回答

3

当前版本中没有内置的方法来实现此功能。(但是您可以调用自己的方法来实现。)

要调用其方法的对象必须放入数据模型(即模板上下文)中。(对于静态文件:freemarker.org/docs/pgui_misc_beanwrapper.html#autoid_55

但是,为了更方便维护,我建议这样做:创建类 com.foo.Base64EncoderMethod implements TemplateMethodModelEx (在其中调用Base64.encodeBase64),然后创建一个模板lib/utils.ftl(如果您还没有类似的内容),并在其中调用 <#assign base64Encode = 'com.foo.Base64EncoderMethod'?new()>。然后在模板中,调用 <#import '/lib/utils.ftl' as u>,然后调用 ${u.base64Encode(photo.data)}


1
你怎么做到的?我在我的应用程序中使用commons-codec进行base64编码。该函数是:Base64.encodeBase64(byte[]) - Michael
1
你想调用方法的对象必须放入数据模型(=模板上下文)中。(对于静态内容:http://freemarker.org/docs/pgui_misc_beanwrapper.html#autoid_55)但是,为了更容易维护,我更喜欢这种方式:创建`class com.foo.Base64EncoderMethod implements TemplateMethodModelEx(内部调用Base64.encodeBase64),然后创建一个模板lib/utils.ftl(如果你还没有类似的东西),在其中添加<#assign base64Encode = 'com.foo.Base64EncoderMethod'?new()>,然后在模板中添加<#import '/lib/utils.ftl' as u>${base64Encode(photo.data)}`。 - ddekany
1
创建一个TemplateMethodModelEx实现是一件麻烦的事情。它将字节数组转换为包含Byte对象列表的SimpleSequence对象,您必须迭代该列表以便将其转换回原始的基本byte数组,以供base64编码器使用。我认为在这种情况下,我更喜欢静态模型技术。 - Michael
1
那个 byte[] 转换确实很糟糕。但我相信这是 DefaultObjectWrapper 特有的问题。我一直使用纯净的 BeansWrapper(或者一个自定义扩展的 BeansWrapper)作为全局的 object_wrapper 设置,这样我就可以在合适的时候获取回原始对象了。但是在现有应用程序中切换包装器并不容易,因为它可能会破坏现有的模板。另外,静态的部分也使用 BeansWrapper - ddekany
1
听起来好像如果我创建了自己的BeansWrapper实现,就可以防止它搞乱字节数组。 - Michael
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接