为多个用户存储图像

时间:2009-02-21 14:30:46

标签: architecture web-applications image storage

平台并不像理论那么重要。为了记录,它是ASP.NET(C#on 3.5 SP1),SQL Server 2005.为了争论,我有无限的空间(文件系统和数据库)和无限的带宽。

我正在开发一个项目,允许多个用户上传自己的图像,这些图像可由该用户管理并由所有用户查看。我试图确定最好的存储机制是什么。我的想法是,我想避免直接将它们存储在数据库中,尽管我可以看到存储有关图像的信息。

我看到的是用户会上传图片。服务器将为图像创建唯一的名称,将其存储到文件系统,并将关于该图像的关系数据存储在数据库中(即,当它被上载时,与用户的关联,对标题的引用等)。将这些放在磁盘上是将来能够转移到CDN的一步。

有没有人使用过这样的方法,或者可以推荐一种不同的方法?是否应该有某种文件夹结构,例如每个用户的文件夹以帮助文件访问时间?

任何反馈都将不胜感激!

3 个答案:

答案 0 :(得分:3)

我同意将图像/文件存储在文件系统而不是数据库上是一种很好的方法。

关于文件访问时间,如果目录包含大量文件,您可能需要检查您使用的文件系统的行为方式。如果这是一个巨大的列表,某些文件系统可能会降低性能。如果是这样,您可能想要创建一些文件夹结构,例如从00-FF开始,这可能会在几个级别上,具体取决于您期望的文件数量。你可以,例如使用某些字段的MD5哈希值(如文件名)将其排序到正确的目录中(例如散列FABE063E ...进入FA / BE /文件名)。

如果您不希望文件名可以被猜测以限制访问,您还可以使用一些哈希甚至随机字符串作为文件名。这样,只有知道文件名的用户(例如,通过提供链接)才能访问此文件。如果您想要移动到最终无法自行检查权限的CDN,这也可能很重要。

(如果权限不重要,OTOH想要可猜测的文件名,你显然会采用其他方式,并可能使用用户名作为文件夹结构等。)

答案 1 :(得分:1)

我认为你应该考虑的是引用PresentationBase.dll,它可以让你访问由Windows Presentation Foundation包装的Windows Imaging Component(WIC)。即使这是一个ASP.NET项目,您也可以依赖这些类进行图像编码和解码。这些类值得使用二进制数据或流,可以解码和编码几种流行的图像格式,并通过不同的解码和编码,高度和宽度在高分辨率存储中动态生成缩略图。

这些类位于System.Windows.Media.Imaging命名空间中,并从BitmapEncoder或BitmapDecoder派生。如果您使用这些类,还可以使用其他几个第三方实现。

答案 2 :(得分:1)

我认为就推荐的做法而言,你已经走在正确的轨道上:在数据库中存储数据关于上传的文件,例如文件系统位置,文件名,属性,标题等,但是将实际文件存储在为此目的明确指定的指定文件夹中。

此方法还允许您检查上载的文件是否存在格式限制,并在最终确定上载过程之前对其进行扫描。

绝对不建议在数据库中存储图像等二进制内容,这种看法似乎相当普遍。