我应该如何为Web应用程序存储用户上传的图像?

时间:2015-08-30 11:04:05

标签: database web-applications filesystems filenames scalability

在我的网络服务器上,我有两个文件夹showcasethumbnail,分别用于存储图片及其缩略图。数据库获取这些图像以在页面上显示它们。

showcase表格中的表格列为s_image,其中存储了/showcase/urlcode.jpg之类的内容。

我听说在文件夹中大约10-20k的文件后,它开始变慢。那么我应该在填充后创建第二个文件夹showcase2吗?是否有某种自动创作可以为我做到这一点?

感谢您的意见。

1 个答案:

答案 0 :(得分:0)

当您将数万个文件放在一个目录中时,您使用的文件系统很重要。 Linux上的extfs4比Windows上的NTFS更好。

Windows具有8.3文件名的兼容模式(旧的DOS文件名标准)。这会导致每个文件名长于abcdefgh.ext,为其创建一个别名abcd~123.ext。这很慢,当单个目录中有大量文件时,非常慢。您可以关闭这种古老的兼容性行为。看这里。 https://support.microsoft.com/en-us/kb/121007。如果您关闭它,它可以快速解决即时性能问题。

但是,一个目录中的20,000个文件是一个很大的数字。在任何类型的文件系统上,最好的选择是根据更改的内容自动在文件系统中创建子目录。一种策略是基于年/月创建子目录,例如

 /showcase/2015/08/image1.jpg  (for images uploaded this month)
 /showcase/2015/09/image7.jpg  (for images next month)

将这些较长的文件名存储在表格的s_image列中显然没有问题。

或者,如果您有一些系统来命名图像,请利用它来创建子目录。例如,如果您的图像被命名为

 cat0001.jpg
 cat0002.jpb
 ...
 cat0456.jpg
 ...
 cat0987.jpg

您可以根据名称的前五个字母

创建子目录
 /showcase/cat00/cat0001.jpg
 /showcase/cat00/cat0002.jpb
 ...
 /showcase/cat04/cat0456.jpg
 ...
 /showcase/cat09/cat0987.jpg

如果你这样做,最好保持图像名称不变而不是缩短它们(例如,不要这样做/showcase/cat09/87.jpg)因为如果你必须按名称搜索特定的图像你想要那里的全名。

据我所知,文件系统中没有自动为您执行此操作。但是你的计划并不难。