2010-10-04 104 views
3

我的应用程序使用存储在EAR中的图像生成PDF。这些图像每月都会更改一次,我想将它们移到数据库中,以避免每次更改图像文件时进行部署。从数据库中读取FOP图像

Unforunately有一个问题:

<fo:block> 
      <fo:external-graphic src=”testImage.gif”/> 
</fo:block> 

的FOP可以只接受URL作为参数。 我可以创建一个读取数据库的servlet,并可以给出一个图像,然后我可以从FOP上下文中引用servlet url,但我认为这不是最好的解决方案。 另一种解决方案是将图像存储在文件系统中并将文件名记录在数据库中,但我确实不喜欢这些选项。 您如何看待这些解决方案?有第三个吗? 谢谢 Zoltan

回答

2

我认为你的servlet选项可能是最好的。

这是另一个选项,不知道它是否是一个好选择。将图像以文件名作为主键存储在数据库中。在应用程序启动过程中,将所有图像从数据库中提取出来,并将它们写入给定文件名的适当位置,以便FOP逻辑可以找到它们。

无论何时在数据库中更改映像时都需要重新启动应用程序,或者需要添加一种方法强制它刷新磁盘上的映像文件。

2

假设您在应用程序中嵌入FOP并以编程方式运行转换,您应该能够使用自定义URI解析器来完成此操作。

然后你的例子会变成这样的事情(你可以用它代替“DB”的任何方案):

<fo:block> 
      <fo:external-graphic src=”db:testImage.gif”/> 
</fo:block> 

您需要注册“分贝:”有FOP用户代理URI方案处理程序(或FOP工厂)在处理之前。详细信息请查询FOP embedding guide(搜索“URIResolver”)。

此外,FOP附带ServletContextURIResolver,您可以使用它作为示例,有关详细信息,请参阅How to use Apache FOP in a Servlet