【问题标题】:Storing Images for Multiple Users为多个用户存储图像
【发布时间】:2009-02-21 14:30:45
【问题描述】:

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

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

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

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

任何反馈都将不胜感激!

【问题讨论】:

    标签: architecture web-applications image storage


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这绝对是应该考虑的事情。我并不担心保护访问,因为它们旨在在应用程序的用户之间共享。我可能必须模拟一些文件夹结构并执行一些访问测试才能获得真正的时间测量。
    • 这是一个很好的答案!您已经触及了一些似乎只在开发周期后期才得到解决的概念。 +1
    • 谢谢 :-) 我正在尝试提前考虑这些事情,即使我以后不需要它。但最好尽早启用这些功能,以后不要搞砸了。
    【解决方案2】:

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

    此方法还允许您检查上传文件的格式限制,并在完成上传过程之前对其进行病毒扫描。

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

    【讨论】:

    • 谢谢。由于“其他人都在做”的心态,我曾经将图像存储在数据库中,但它不再有意义了。我什至还没有考虑过病毒扫描。
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢你,约翰!我还没有用 WPF 做太多事情,所以这听起来绝对是让我的脚湿透的好方法。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2015-08-31
    • 2017-11-25
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多