我正在开发主要使用PHP和MySQL的在线文件存储服务,用户可以在其中上传最大10到20 GB的文件。
未注册用户将能够上传文件,但不能在个人存储空间中上传文件,而只能在其中存储未注册用户的所有文件上传目录。
注册用户将获得固定数量(将来可能会增加)的个人存储空间,并可以使用文件管理器轻松管理和整理其所有文件。他们还可以将自己的文件设置为 private (除了自己之外,其他任何人都不能下载)或公开。
什么是可能的良好目录设置?
我正在考虑一个“个人”目录,该目录将包含带有用户ID的文件夹,作为每个注册用户的文件夹名称。
在个人目录旁边,将有一个“其他”文件夹,其中仅包含未注册用户上载的每个文件。
这两个都将包含上载的文件,每个文件的相应行ID(来自数据库中的文件表)均作为文件名。
ROOT
FOLDER uploads
FOLDER personal
FOLDER 1
FILE file_id1
FILE file_id2
(...)
FOLDER 2
FILE file_id3
FILE file_id4
(...)
(...)
FOLDER other
FILE file_id5
FILE file_id6
(...)
这是我第一次处理这样的情况,但是到目前为止,我仍然可以想到这个概念。任何建议也欢迎!
最佳答案
基本上,您需要解决以下主题:
=====================更新
通过这些注释,我们现在知道您将元数据存储在关系数据库中,具有物理层(磁盘上的文件)和逻辑层(通过php脚本进行访问),并且物理文件/文件夹层基于ID。
这为将所有结构上的注意事项完全移到关系数据库中提供了空间,并可能从一开始就改善了物理层。因此,这是我将创建的sql数据库表:
======
users
======
id (unsigned INT, primary key)
username
password
isregisteredflag
...any other not relevant for the topic...
======
files
======
id (unsigned INT,primary key)
filename
_userid (foreign key to users.id)
createddate
fileattributes
...any other not relevant for the topic...
======
tag2file
======
_fileid (foreign key to files.id)
_tagid (foreign key to tag.id)
======
tags
======
id (unsigned INT,primary key)
tagname
由于此结构允许您从用户ID派生文件,也可以从文件中派生userID,因此您不需要将该关系存储为文件夹结构的一部分。您只需在物理层files.id上命名文件,这是数据库生成的数字值。由于ID是由日期数据库生成的,因此请确保它们具有唯一性。现在,您还可以使用标签,为用户提供更丰富的分类体验(如果您不喜欢标签,也可以在数据库中添加文件夹)。
注意第4点对您的设计有很大影响。如果您在设置完所有内容后都小心翼翼,则可能会加倍努力。由于一切都可以通过数字ID构建文件,因此,将物理文件存储在no-sql数据库(而不是文件系统)中的键值存储中非常简单,这使您的系统可扩展为 hell 。这意味着您将使用一个用于元数据和结构数据的sql数据库和一个用于文件内容的nosql数据库。
顺便说一句。覆盖您的 public 文件,我假设您有一个ID = 1的用户“public”。这最终导致某些数据硬编码很丑陋。但是,由于“ public ”功能是应用程序中的核心元素,因此您可以通过以适当的方式进行记录来为不成文的法律做出贡献。或者,您可以添加更多表并以“干净”的方式扩展代码以覆盖两个不同的内容。
关于directory - 在线文件存储服务的目录设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24085722/