我实际上已经建立了一个类似的网站(大量图片上传器),所以我可以根据经验说话。
跟踪文件
将图像文件按原样保存在磁盘上,并将文件的路径保存在数据库中。这部分应该很简单。
一个缺点是您需要对每张图像进行数据库查找,但如果您的表经过良好优化(索引),这应该不是真正的问题。
有很多优点,例如您的文件易于引用,并且您可以将元数据添加到您的文件中(例如查看次数)。
文件名
现在,保存文件,大量文件,并不是一蹴而就的。
如果您根本不关心文件名,只需生成一个随机哈希,例如:
$filename = md5(uniqid()); // generate a random hash, mileage may vary
这可以解决所有与文件名相关的问题,例如重复文件名、不支持的字符等。
如果要保留文件名,请将文件名存储在数据库中。
如果您希望磁盘上的文件名也具有某种人类可读性,我会采用混合方法:部分是哈希,部分是原始文件名。您将需要过滤不受支持的字符(如/),并可能音译类似的字符(如é -> e 和ß -> ss)。汉语和希伯来语等外语可以产生有趣的结果,因此请注意这一点。您还可以对任何外来字符(如 base64_encode)进行编码,但这对可读性影响不大。
最后,请注意文件路径长度限制。文件名和文件路径不能无限长。我相信 Windows 的完整路径是 255。
桶
您绝对应该考虑使用存储桶,因为操作系统(和人类)不喜欢包含数千个文件的文件夹。
如果您使用的是哈希,那么您已经有一个方便的存储桶方案可用。
如果你的哈希是0aa1ea9a5a04b78d4581dd6d17742627
您的存储桶可以是:0/a/a/1/e/a9a5a04b78d4581dd6d17742627。在这种情况下,有 5 个嵌套桶。这意味着在 16^5(约 100 万)个文件之后,您可以期望在每个存储桶中有 一个 文件。您需要多少级别的存储桶取决于您。
哑剧类型
跟踪原始文件扩展名/mime 类型也很好。如果您只有一种 mime 类型(如 TIFF),则无需担心。大多数文件都有某种方法可以轻松检测到它是该格式的文件,但您不想依赖它。 PNG 以 PNG 开头(使用文本编辑器打开一个即可查看)。
相对路径与绝对路径
我还建议保存文件的相对路径,而不是绝对路径。这使得维护更加容易。
所以保存:
0/a/a/1/e/a9a5a04b78d4581dd6d17742627
代替:
/var/www/wwwdata/images/0/a/a/1/e/a9a5a04b78d4581dd6d17742627