我正在开发一个用户可以上传图片的社交系统。
我不太确定我应该如何组织我的文件。我有以下两个想法:
- 添加一个以userID为名称的文件夹,并将所有用户的图像放在那里
- 为所有图像创建一个文件夹,并给每个图像一个唯一的名称
两者中哪一个会更好?这是组织图像的正确方法吗?
看情况。
当您使用每个用户在一个目录中存储图像的图库时,您还必须担心重复(假设用户将上传几个同名的文件)。
另一方面,在第一种情况下,您可能会遇到与单个目录中的文件数量相关的性能问题(如果您有超过10k的文件,它可能会延迟)。
我喜欢的解决方案是创建一个唯一的名称,并将其裁剪成几个部分来创建一个目录结构。
例如:从文件
image.jpg
(查看手册)生成一个唯一的名称,例如nfsr53a5gb
添加原来的扩展名,使其成为
nfsr53a5gb.jpg
与
/
拆分为nf/sr/53/a5/gb.jpg
创建丢失的文件夹(参见
recursive
参数)
你不会很快遇到目录中文件数量的惩罚,你不会得到冲突和文件的url难以猜测。
一个很好的方法是添加一个控制器来获取那些将名称更改为原始名称的文件(将其存储在数据库中并切换标题)。它只用于一个专用的下载按钮,因为对于嵌入在一个页面上的许多图像来说,这可能会占用太多的CPU和I/O。
要做到这一点,你必须像这样修改标题:
Content-Disposition: attachment; filename=YOUR_FILE_NAME.YOUR_EXTENSION
Content-Type: application/octet-stream
选择#2选项,否则如果用户数量增加,文件夹数量将继续增加
对于在代码中获取图像,这个方法也会更简单。