我正在开发一个Web应用程序,我需要在服务器上存储图像(这些图像由用户上传)。我为每个新图像生成新的Guid。我正在创建一个图像的三个图像,即原始图标,图标和拇指。我仍然使用三个不同的文件夹来保存这些。我的项目经理问我为什么没有为每个用户创建不同的文件夹。 所以我的问题是哪种更好的方法来存储以下内容之间的图像:
1)。仅在三个文件夹中上传图像,即原始图标,图标和拇指, 要么 2)。为每个用户创建文件夹,然后在其中创建三个文件夹,用于原始,拇指和图标。 有一件事我想问一下,如果用户数量超过100000则会影响性能???
这是更好的方法。请帮我决定。谢谢
答案 0 :(得分:9)
我会按用户存储图像。但是,鉴于您可能拥有大量用户,可能不会那么简单。
用户文件上传只是:用户特定的文件上传。管理这些文件时,通常需要为每个用户应用各种过程。例如: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文件系统上存储文件。
答案 1 :(得分:3)
这取决于。出于安全考虑,我更喜欢按用户文件夹存储图像。如果安全性不相关,我会存储在三个不同的文件夹中,因为文件夹的数量。
更新: 每次创建文件夹都会强制ASP.NET重新编译应用程序池,并带来一些后果,例如:会话失去了。
我建议像这样创建文件夹结构:
year
month
day
hour - if necessary
images
这意味着每小时只能创建一个文件夹。但是使用此解决方案,必须为每个用户保存图像路径。
答案 2 :(得分:0)
我会按用户存储它,但我不会为每个图像大小创建额外的文件夹。我只是将这三个图像直接存储在用户文件夹中。
另外,我会将项目文件夹外的所有文件夹存储为一种方法,以避免在创建新文件夹时重新启动应用程序。