我正在开发一个用户可以上传图片的社交系统。
我不太确定我应该如何构建我的文件。我的两个想法如下:
- 添加一个以 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 选项,或者如果用户数量增加,文件夹数量将继续增加。
对于在您的代码中获取图像,此方法也将更简单。