我正在使用 Struts 2.1.2 和 Hibernate 3.2.6.GA 开发一个 Web 应用程序。我有一个实体,User
,我已将其映射到表 USERS
在数据库中使用 Hibernate。我想要一个与该实体关联的图像,我计划将其存储为 BLOB
在数据库中。我还想在网页上显示图像以及 User
的其他属性.
我能想到的解决方案是有一张 table IMAGES(ID, IMAGE)
哪里IMAGE
是 BLOB
柱子。 USERS
将有一个FK
名为 IMAGEID
的列,它指向IMAGES
table 。然后我将在 User
上映射一个属性实体,名为 imageId
映射到此 IMAGEID
作为龙。当使用 JSP 渲染页面时,我会将图像添加为 <img src="images.action?id=1"/>
等,并有一个读取图像并将内容流式传输到浏览器的操作,并将 header 设置为长期缓存图像。
这行得通吗?是否有更好的方法来渲染存储在数据库中的图像?首先将此类图像存储在数据库中是正确的方法吗?
最佳答案
是的,您建议的解决方案可行。鉴于您正在 Java 环境中工作,将图像存储在数据库中是最好的方法。如果您在带有应用程序服务器的单服务器环境中运行,从技术上讲,该服务器允许您以分解格式进行部署,您可以将镜像存储在磁盘上,但这不是最佳实践。一种建议是使用 servlet 而不是 JSP。为了获得良好的浏览器行为,您希望浏览器认为它正在显示的文件类型与其期望的文件类型匹配。尽管存在 mime 类型 header ,文件扩展名仍然非常重要。所以您想要一个如下所示的链接:
<a href="foo.jsp"><img src="imageservlet/123456789.png"></a>
其中 123456789 是数据库中图像的主键。您的 servlet 映射将如下所示:
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>com.example.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/imageservlet/*</url-pattern>
</servlet-mapping>
然后在您的 servlet 中只需解析图像 ID 的请求 URL,而不是使用查询字符串,因为查询字符串会使某些浏览器感到困惑。使用查询字符串不会彻底破坏浏览器,但您会在缓存方面遇到奇怪的行为,并且某些浏览器可能会将内容报告为不安全。
关于hibernate - 如何使用 Struts 2 + Hibernate 3 向浏览器提供图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/151100/