繁体   English   中英

你如何存储asp.net应用程序的图像?

[英]How do you store images for asp.net application?

我们只是将我们的ASP.Net商店实施(从简单的实施)升级到应该更灵活的结构。 我只是在寻找一些如何存储与产品相关的图像的选项。 (将有两种类型的图像,产品的拇指,然后是产品的全视图图像)。 它应该处理至少一百种产品。

到目前为止,我正在考虑两个选项:
1)在db中存储图像 - 图像从Db加载到流然后加载到图像中(使用IHttpHandler显示)
优点
- 图像本身是我们正在代码背后使用的类,业务对象的一部分
- 一个维护产品数据的地方
缺点
- 内存消耗 - 当我们从其他API获取产品数据时,流量会增加

2)将图像存储在文件系统中 - 图像作为链接放在页面中
优点
- 没有影响内存,因为它没有存储在会话,应用程序缓存中。它像简单的链接一样使用
- 没有内存消耗
缺点
- 需要为文件系统中的图像保留一些​​名称约定(甚至可能是某些文件夹结构)
- 更复杂的图像维护

还有其他合适的机制吗? 你会建议使用什么?

我个人更喜欢文件系统中的图像,但由于存在两个不同的位置,因此可能难以维护它。

谢谢你的评论。 X。

顺便说一句:我真的可以想象,在某个阶段,产品也会有一些视频或任何其他需要显示的媒体。 在这种情况下,Db不是真正的选择,不是吗?

我制作了一个与此类似的系统。 在我看来,页面加载速度胜过所有其他考虑因素,所以我选择了“在磁盘上存储图像”选项。

当图像被添加到系统时,原始图像被裁剪并调整大小到所需的显示尺寸以供浏览,并且还生成缩略图。 然后将三个图像存储到磁盘,原始图像,显示大小和缩略图。 每个人都有为其文件名生成的GUID。

(想象一下在亚马逊上购物,当您浏览产品列表时,只有缩略图可见。当您检查产品时,会显示其显示尺寸,您通常可以再次单击该图像以查看完整尺寸。)

我有一个看起来有点像这样的数据库表。

ID                int, PK
FullSizePath      varchar(128)
DisplaySizePath   varchar(128)
ThumbNailPath     varchar(128)
OriginalData      BLOB

我将原始数据保存在数据库中,只是在文件服务器上发生意外并且图像被删除,因此它们都可以重新生成。 但是在页面请求期间从不从数据库中提取此数据。

我认为两者的混合是最好的,对于小的关键图像db是优选的,并且对于大量和大小的文件系统是更好的

我想你已经覆盖了任何东西。 您可以将主映像存储在filesystem / db中,但是可以以编程方式动态生成缩略图,这样可以减少一些磁盘空间。

在您的示例中,我工作的地方倾向于将图像存储在磁盘上,然后在db中保留文件名的记录。

然后,当您拥有产品的数据库时,您可以查找并动态加载每个产品的图像。

如果您有一个用于添加/删除/编辑产品的管理系统,这也非常好。

我认为它介于两个原始建议之间,如果您愿意,甚至可以将所有图像存储在同一目录中。

如果您使用的是MS SQL 2008,则可以选择FILESTREAM功能

这是要点,但你应该阅读整篇白皮书:

FILESTREAM是SQL Server 2008发行版中的一项新功能。 它允许将结构化数据存储在数据库中,并将相关的非结构化(即BLOB)数据直接存储在NTFS文件系统中。 然后,您可以通过高性能Win32®流API访问BLOB数据,而不必支付通过SQL Server访问BLOB数据的性能损失。

FILESTREAM始终保持结构化和非结构化数据之间的事务一致性,甚至允许使用日志备份对FILESTREAM数据进行时间点恢复。 SQL Server会自动维护一致性,并且不需要应用程序中的任何自定义逻辑。 FILESTREAM机制通过维护数据库事务日志的等效来实现这一点,该日志具有许多相同的管理要求(在本白皮书后面的“配置FILESTREAM垃圾收集”一节中有更详细的描述)。 数据库的事务日志与FILESTREAM事务日志的组合允许FILESTREAM和结构化数据在事务上正确恢复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM