【发布时间】:2023-04-08 08:08:02
【问题描述】:
我将用户的文件存储在他们自己的名称目录中,例如
/username/file01.jpg
/username/file02.mp4
/username/file03.mp3
但是如果更多用户来上传更多文件,那么这会产生问题,因为这会导致一些或许多用户迁移到另一个驱动器。我首先选择用户名目录解决方案,因为我不希望文件名混合。我也不想更改文件名。此外,如果另一个用户上传相同的文件名,那么如果文件以原始名称存储,则会产生问题。
最好的方法是什么?我有一个解决方案,但想问社区这是最好的方法。
我将使用顺序文件夹,然后将文件名散列到一些非常独特的东西并存储到目录中。 我要做的是将文件的原始名称和用户名存储到数据库中,并将文件名的哈希值存储在磁盘中。
当任何人想要访问该文件时,我将通过 php 读取该文件,或者替换名称,或者在此时执行某些操作,以便将文件作为原始文件名下载。
我只考虑这个建议的解决方案。你们还有比这更好的吗?
编辑:
我也使用文件夹系统,可能第二种方式我将使用虚拟文件夹。 我的数据库是 MongoDB
各位,你们所有的答案都很棒而且很有帮助。我想给每个人赏金,这就是我离开它的原因,以便社区可以自动提供。 谢谢大家的回答。我真的很感激。
【问题讨论】:
-
我发现用户 ID(不变的值)是组织上传的更好方法。手动导航更难(查看文件夹不会告诉您谁在上传),但它可以让用户名更改而不会破坏与其对应的资产文件夹。
-
因为您正在为每个文件创建一个数据库条目,所以您可以存储一个“存储卷 ID”,每次存储卷上的空间不足时您都会递增该 ID。获取文件后,您将获得用户 ID、文件哈希和存储卷名称,您可以将它们组合起来检索资产。我只是使用 Amazon S3,让他们处理这样的事情
-
您还可以研究基于云的解决方案,例如 AWS S3,它会自动为您处理扩展。我们使用类似的结构(带有 id)来管理 S3 上的用户文件。
-
我的一个下载解决方案是将所有内容保存在公共目录之外的文件夹中。上传时,它会使用路径保存到数据库中,即:
/home/user/files/1/image.png,然后我根据文件名和插入 ID 创建一个哈希,然后将其保存到数据库中。检索只是使用 PHP,因此我们可以控制下载的内容和下载计数器。任何具有相同文件名的东西都没有关系。并且一定要研究 S3。 -
请注意,如果您有很多(几千个)用户,那么根 i 节点可能会变大,所以一个简单的 ls 命令可能需要很长时间。所以也许创建子目录,比如
/a/anakin等可能是个好主意。
标签: php database linux file file-upload