【发布时间】:2012-11-25 03:35:52
【问题描述】:
有没有办法在 Freemarker 模板中将字节数组转换为 base64?比如:
<img src="data:image/jpeg;base64,${photo.data?base64}" />
谢谢。
【问题讨论】:
标签: java base64 freemarker
有没有办法在 Freemarker 模板中将字节数组转换为 base64?比如:
<img src="data:image/jpeg;base64,${photo.data?base64}" />
谢谢。
【问题讨论】:
标签: java base64 freemarker
当前版本中没有内置方法。 (当然你也可以调用你自己的方法来做。)
您要调用其方法的对象必须放入数据模型(即模板上下文)中。 (静态: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)}
【讨论】:
Base64.encodeBase64(byte[])
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)}。
TemplateMethodModelEx 实现很麻烦。它将字节数组转换为包含Byte 对象的List 的SimpleSequence 对象,您必须对其进行迭代才能将其转换回base64 编码器的原始byte 数组。在这种情况下,我认为我更喜欢静态模型技术。
byte[] 转换的事情确实很可怕。但我相信这是DefaultObjectWrapper 特有的问题。我一直使用纯BeansWrapper(或自定义扩展)作为全局object_wrapper 设置。然后我可以取回有意义的原始对象。但是在现有应用程序中切换包装器并不容易,因为它可能会破坏现有模板。顺便说一句,静态的东西也使用BeansWrapper。
Base64Generator 类,它不扩展任何东西并且有一个encode(byte[]) 方法。我刚刚创建了这个类的一个实例并将其传递给数据模型。似乎工作正常。