我正在开发一个允许人们上传图片的网站。我们将每张图片调整为 4 种尺寸。我们预计会有大量图片,并且正在考虑提高文件结构性能的方法,因为我们并不希望一个目录中有成千上万个文件。有人对我们如何组织文件有什么建议吗?
显而易见的选择是
每个用户都有自己的文件夹,其中每个尺寸都有一个文件夹
(四个文件夹每个都可以容纳很多图像)
/user_uploads/user01/
|-/size_thumb/
|-/size_small/
|-/size_medium/
|-/size_large/
/user_uploads/user02/
|-/size_thumb/
|-/size_small/
|-/size_medium/
|-/size_large/
etc etc
或者 每个用户的照片都存储在一个文件夹中 (每个目录的照片较多,但总体目录较少)
/user_uploads/user01/
/user_uploads/user02/
etc etc
每张照片按大小存储
每个目录中有大量的照片(可以按日期进一步细分为子文件夹吗?)
/user_uploads/small/
/user_uploads/medium/
/user_uploads/large/
/user_uploads/thumbs/
/user_uploads/userID/
有人有什么想法吗?我想除非有人有任何建议,否则我们可能会继续。
(目前所有内容都托管在一台计算机上,因此我们不必担心文件位于不同的服务器上)
答案1
您可能想尝试在上传图像时对其进行 md5 哈希处理,然后将其存储在如下所示的目录结构中。假设有 3 幅图像的哈希值为:
- 2b00042f7481c7b056c4b410d28f33cf
- 84bdbf7c4d48e16642af4c317df428c2
- 7b2a7edc6e86224d6ba0f97b717c80ed
文件夹结构如下:
/图片/原始/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg /图片/原始/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg /图片/原始/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg /图片/大/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg /图片/大/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg /图片/大/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg /图片/小/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg /图片/小/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg /图片/小/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg
您可以按照上述模式创建任意多个级别,只要您希望目录大小易于管理即可。此外,如果您愿意,您可以使用一些用户 ID 来识别图像,并且仍然使用类似的结构,例如假设用户 ID 为 14:(/images/orig/0/00/0014/0014.jpg)
您可以将用户 -> 图片哈希数据存储在数据库中,同时将图片保存在文件系统中。尽管可能虽然可以将图像存储在数据库中,但出于某些原因,您可能不想这样做。将它们保存在文件系统上可以更轻松地移动它们,例如随着业务的增长移动到 CDN 或云中。如果您愿意,它还允许您将目录放在不同的磁盘上以提高读取性能。
将原始图像哈希为 md5 意味着,如果有 30 个人上传完全相同的图像,您将只会在文件系统上保留该图像的一个副本(所有尺寸),而不是 30 个副本。