【问题标题】:which is better way to store images on server in web application?在 Web 应用程序的服务器上存储图像的更好方法是什么?
【发布时间】:2012-10-07 14:15:11
【问题描述】:

我正在开发一个 Web 应用程序,我需要将图像存储在服务器上(这些图像由用户上传)。我正在为每个新图像生成新的 Guid。我正在创建一个图像的三个图像,即原始图像、图标和拇指。我仍然使用三个不同的文件夹来保存这些。我的项目经理问我为什么我没有为每个用户创建不同的文件夹。 所以我的问题是在以下之间存储图像的更好方法是:

1)。仅在三个文件夹中上传图像,即 Original、Icon 和 Thumb, 要么 2)。为每个用户创建文件夹,然后在其中为原始、拇指和图标创建三个文件夹。 有一件事我想问如果用户数量超过100000那么它会影响性能吗???

这是更好的方法。请帮助我做出决定。谢谢

【问题讨论】:

  • 您如何检索图像?你有他们的路径存储在数据库中吗?
  • 不,我仍然没有在数据库中存储路径。如果我需要更改流程意味着要为每个用户创建不同的文件夹,那么我会这样做。

标签: c# asp.net image webserver directory


【解决方案1】:

我会按用户存储图像。但是,考虑到您可能拥有大量用户,事情可能没有那么简单。

用户文件上传就是:用户特定的文件上传。当您管理这些文件时,您通常需要为每个用户应用各种程序。例如:1)移除用户账户并删除所有相关文件,2)计算用户使用的空间量,3)列出用户上传的所有文件,等等。

如果您将这些文件分散在不同的目录中,则很难有效地实施上述过程。

您指定您可能拥有超过 100.000 个用户。根据您的文件系统是什么,您最终可能会因此而遇到麻烦。例如,在 ext3 中,每个目录最多有 32K 个子目录,这对于在每个用户的目录中组织文件可能是个问题(请参阅:How many files can I put in a directory?)。

假设我们不能在一个目录中存储超过 32K 的文件或目录,那么您需要找到一种解决此限制的方法。例如,您可以根据用户名中的第一个字母将用户文件夹分成几个子目录(并为所有其他起始字符添加一个额外的子目录):

users
   a
      aaron
         ...
   b       
      bertie
         ...
   ...
   misc
      _foobar 
         ...
      @jack
         ...

现在每个目录只有大约100000/25=4000 个用户,在给定的 32K 之下。

跳出框框思考,将图像作为文件存储在平面文件系统中可能不是正确的选择。有专门为存储和处理大量文件而创建的数据库系统。采取MongoDB's GridFS for instance。它非常高效,可以扩展到大量文件,还可以处理所有较低级别的问题,例如正确的文件系统使用。在 MS SQL 中有the FILESTREAM Storage,它特别擅长将文件存储在 NTFS 文件系统上。

【讨论】:

  • 我们为什么要走这条路?你有什么具体的理由让我可以转让我的经理
  • 有一件事我想问一下如果用户数量超过100000那么它会影响性能吗???
  • 哦,哇。你之前没提过。
【解决方案2】:

这取决于。出于安全原因,我更喜欢按用户文件夹存储图像。如果安全性无关紧要,由于文件夹的数量,我将存储在三个不同的文件夹中。

更新: 每次创建文件夹都会强制 ASP.NET 重新编译应用程序池,并带来各种后果,例如会话丢失。

我建议创建这样的文件夹结构:

year
  month
    day
      hour - if necessary
        images

这意味着每小时只需创建一个文件夹。但是使用此解决方案,有必要为每个用户保存图像路径。

【讨论】:

  • 为什么?恕我直言,仅将目录数量最小化并不是一个好的论据。如果您有超过 32000 张图像,如果它们都存储在同一个目录中,您最终会遇到麻烦(请参阅:stackoverflow.com/questions/466521/…)。然后你最终通过添加子文件(如 images/a/、images/b/ 等)来解决问题,我称之为一团糟。去过那里。
  • @jsalonen:你说得对。你会遇到这么多文件的问题。但是每次创建一个新文件夹都会迫使 ASP.NET 重新编译应用程序池(取决于设置),这会带来各种后果,例如会话丢失。
  • 感谢您提供重要的额外信息。请注意,提问者还告诉用户可能超过 10 万,这使得这个问题变得更加复杂。
  • 编辑了我的答案...根据我的经验,这个解决方案就足够了
【解决方案3】:

我会按用户存储它,但我不会为每个图像大小创建额外的文件夹。我只是将这三个图像直接存储在用户文件夹中。

另外,我会将所有文件夹存储在项目文件夹之外,作为一种避免在创建新文件夹时重新启动应用程序的方法。

【讨论】:

  • 有一件事我想问一下如果用户数量超过100000那么它会影响性能吗???
  • @Visions 我不相信您会注意到 100000 个文件夹的任何性能差异,除非您一次迭代所有文件夹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多