5

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

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

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

4

3 回答 3

10

我会按用户存储图像。但是,鉴于您可能有很多用户,它可能不是那么简单。

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

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

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

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

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

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

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

于 2012-10-17T10:35:18.937 回答
3

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

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

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

year
  month
    day
      hour - if necessary
        images

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

于 2012-10-17T10:40:15.577 回答
0

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

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

于 2012-10-17T10:36:34.090 回答