在网站中存储用户上传文件的最佳方式是什么?

14

我试图创建一个网站,在该网站中,我需要存储一些用户上传的文件(例如一些个人资料图片、一些XML文件等)。

那么存储这些文件的最佳方法是什么?

目前,我为每个新注册用户在服务器上创建一个新目录,并将每个用户的文件存储在各自的目录中,但有人告诉我这不是最好的方法。

那么,我该如何存储这些文件呢?是创建一个共用目录,并根据用户ID或相关信息给文件命名,还是为每个用户都创建一个新目录?


2
他们解释了他们的关注点吗?我的担忧是其他人是否可以访问已上传信息,因为他们知道位置。如果目录是/protected/user/,并且只能通过PHP访问信息,那么这将解决我的唯一担忧。 - Wayne
这确实是一个大问题,但现在,我的应用程序中用户上传的文件可以是公共的,所以我暂时不需要担心这些。 - ptamzz
2个回答

7
一个可行的解决方案将取决于您的要求,例如您期望有多少用户。一个每个用户一个目录的解决方案可能很快会遇到一些文件系统限制(例如对于ext3,一个目录中的子目录最大数量固定为32000)。
一个每个用户一个文件的解决方案应该可以长时间使用(参见:一个目录中有太多文件会怎样?)。
最后,如果您的用户基础增长,您可以使用固定数量的分片(例如基于用户ID),以限制目录数量和每个目录中的文件数量(关于此的示例,请参见git如何以松散格式存储其对象)。

4
您有几种选择。
  1. 您可以将它们作为文件存储在网站根目录之外的文件系统中。
  2. 您可以将它们作为二进制数据存储在标准 RMDBS(如 MySQL)中。
  3. 您可以使用专门用于存储文档的“NoSQL”数据库,例如 CouchDB 或 Redis。
最佳方法取决于您的应用程序、时间表和经验。选项 1 可能是最简单的。选项 2 可能是最灵活的。如果符合您的文档需求,选项 3 可能是性能最好的。

5
我不确定Redis是否专门存储文档—— Redis主要是一个键值存储。在NoSQL数据库讨论中,当使用术语“文档”时,人们通常指的是数据对象,而不是像XML文件这样的东西。然而,我从未听说过将文件的二进制数据存储在数据库中,所以我想这也是可能的。 - Matt
这是我用于Redis存储文档的源代码。http://images.infoworld.com/d/data-explosion/no-sql-new-databases-new-applications-400?page=0,3 我承认我从未使用过它们。我已经将文件存储在数据库中。在PHP中,您可以使用BLOB字段并使用pack()将字符串转换为二进制。我还使用了一种类似GIT的方法,其中我使用了用户ID,将其填充为0000003450,然后创建目录:/00/00/00/34/50/ - Alan B. Dee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接