2011-07-27 110 views
6

我想创建一个网站,我需要存储一些用户上传的文件(如一些配置文件图像,一些XML文件等)。在网站上存储用户上传文件的最佳方式是什么?

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

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

那么,如何存储这些文件?是否我创建了一个公共目录&根据用户标识或与用户相关的内容命名文件或者不断为每个用户创建一个新目录?

+1

他们解释了他们的担忧吗?我担心如果其他人能够访问他们知道位置的上传信息b/c。如果目录是/ protected/user /,并且只能通过PHP来访问信息,这可以解决我唯一的问题。 – Wayne

+0

这确实是一个大问题,但现在,用户上传的文件与我的应用程序可以公开,所以我现在不需要担心这些。 – ptamzz

回答

4

一个可行的解决方案将取决于您的要求,例如,你有多少用户期待。每个用户一个目录的解决方案很快就会遇到一些文件系统限制(对于ext3,一个目录中的最大子目录数固定为32000)。

每用户一个文件应该可以很长时间(请参阅:How many files in a directory is too many?)。最后,如果您的用户基数增加,您可以使用固定数量的分片(例如基于用户标识)来限制每个目录的目录数和文件数(例如,请参见how git stores its objects in loose format)。

+0

谢谢。这回答了我在我心中的很多事情! – ptamzz

1

那么你有几个选择。

  1. 您可以将它们作为文件存储在Web根目录之外的文件系统中。
  2. 您可以将它们作为二进制数据存储在像MySQL这样的标准RMDBS中。
  3. 您可以使用专门用于存储文档的“NoSQL”数据库,如CouchDB或Redis。

最好的方法将取决于您的应用程序,时间范围和您的经验。选项1可能是最简单的。选项2可能是最灵活的。如果选项3满足您的文档需求,选项3可能是最佳选择。

+2

我不确定Redis是否专门存储文档--Redis主要是一个关键:价值存储。当NoSQL数据库讨论中使用术语“文档”时,人们通常指的是数据对象,而不是XML文件。然后,我再也没有听说过将文件的二进制数据存储在数据库中,所以我认为这是可能的。 – Matt

+0

这是我的Redis存储文档的源代码。 http://images.infoworld.com/d/data-explosion/no-sql-new-databases-new-applications-400?page=0,3我承认我从未使用过。我已将文件存储在数据库中。在PHP中,您使用BLOB字段并使用pack()来转换字符串二进制。我还使用了一种非常类似GIT的方法,我使用userid,将其填充到0000003450,然后创建目录:/ 00/00/00/34/50/ –

相关问题