Architecture 为多个用户存储图像

Architecture 为多个用户存储图像,architecture,web-applications,image,storage,Architecture,Web Applications,Image,Storage,平台并没有理论那么重要。记录在案的是ASP.NET(C#on 3.5SP1)、SQLServer2005。为了论证,我有无限的空间(文件系统和数据库)和无限的带宽 我正在进行一个项目,该项目将允许多个用户上传他们自己的图像,这些图像可以由该用户管理并由所有用户查看。我试图确定什么是最好的存储机制。我的想法是,我希望避免将它们直接存储在数据库中,尽管我可以看到存储有关图像的信息 我看到的是,用户会上传图像。服务器将为图像创建一个唯一的名称,将其存储到文件系统中,并将有关该图像的关系数据存储在数据库

平台并没有理论那么重要。记录在案的是ASP.NET(C#on 3.5SP1)、SQLServer2005。为了论证,我有无限的空间(文件系统和数据库)和无限的带宽

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

我看到的是,用户会上传图像。服务器将为图像创建一个唯一的名称,将其存储到文件系统中,并将有关该图像的关系数据存储在数据库中(即,当图像上载时,与用户的关联、对标题的引用等)。将这些存储在磁盘上是朝着将来能够移动到CDN的方向迈出的一步

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


任何反馈都将不胜感激

> P> >我认为您应该考虑引用SeaTrimeBase.DLL,它将让您访问由Windows演示基金会包装的Windows映像组件(WIC)。即使这是一个ASP.NET项目,您也可以依赖这些类进行图像编码和解码。这些类具有二进制数据或流的价值,可以对几种流行的图像格式进行解码和编码,并通过不同的解码和编码、高度和宽度,在高分辨率存储中动态生成缩略图


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

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

这种方法还允许您检查上传文件的格式限制,并在完成上传过程之前扫描文件中的病毒


绝对不建议在数据库中存储二进制内容(如图像),这种观点似乎相当普遍。

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

关于文件访问时间,如果目录包含大量文件,您可能需要检查所使用的文件系统的行为。如果这是一个庞大的列表,某些文件系统可能会降低性能。如果是这样,您可能希望创建一些文件夹结构,例如从00-FF,这可能取决于您期望的文件量,分为几个级别。然后,您可以使用某个字段(如文件名)的MD5哈希将其排序到正确的目录中(例如,哈希FABE063E…进入FA/BE/filename)

如果您不想为了限制访问而猜测文件名,您也可以使用一些散列甚至随机字符串作为文件名。这样,只有那些知道文件名的用户(例如,通过提供指向该文件的链接)才能访问该文件。如果您想要移动到最终无法自己检查权限的CDN,这一点可能也很重要


(如果权限不重要,而且OTOH想要可猜测的文件名,您显然会选择另一种方式,可能会将用户名用作文件夹结构等)

谢谢您,John!我还没有对WPF做太多的工作,所以这听起来绝对是一个让我的脚湿透的好方法。:-)非常感谢。我过去常常将图像存储在数据库中,因为“其他人都在这样做”的心态,但这已经没有意义了。我甚至还没有考虑过病毒扫描,这绝对是应该考虑的。我并不担心保护访问,因为它们是在应用程序的用户之间共享的。我可能需要模拟一些文件夹结构,并执行一些访问测试来获得真实的时间度量。这是一个很好的答案!您已经接触到一些似乎在开发周期后期才得到解决的概念+1汉克斯:-)我正在努力提前考虑这些事情,即使我以后不需要它。但最好是尽早实现这些事情,而不要在以后搞砸。