Directory 联机文件存储服务的目录设置

Directory 联机文件存储服务的目录设置,directory,directory-structure,Directory,Directory Structure,我正在开发一个主要使用PHP和MySQL的在线文件存储服务,用户可以上传10-20GB大小的文件 未注册用户可以上传文件,但不能上传到个人存储空间,而只能上传未注册用户上传的所有文件 注册用户将获得固定数量(将来可能会增加)的个人存储空间,并可以访问文件管理器,以便轻松管理和组织其所有文件。他们还可以将自己的文件设置为私有(除了自己之外,任何人都不能下载)或公共 什么可能是一个好的目录设置? 我正在考虑一个“个人”目录,其中包含以用户id作为每个注册用户文件夹名称的文件夹 除了个人目录之外,还

我正在开发一个主要使用PHP和MySQL的在线文件存储服务,用户可以上传10-20GB大小的文件

未注册用户可以上传文件,但不能上传到个人存储空间,而只能上传未注册用户上传的所有文件

注册用户将获得固定数量(将来可能会增加)的个人存储空间,并可以访问文件管理器,以便轻松管理和组织其所有文件。他们还可以将自己的文件设置为私有(除了自己之外,任何人都不能下载)或公共


什么可能是一个好的目录设置?

我正在考虑一个“个人”目录,其中包含以用户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
           (...)


这是我第一次处理这样的情况,但到目前为止,我所能想到的都是这个概念。欢迎提出任何建议

基本上,您需要解决以下主题:

  • 安全性:根据您的描述,不清楚谁可以读取和访问这些文件。如果这总是“人人都读”,那么您可以在web服务器虚拟服务器中设置一个文件结构。否则,您将在“隐藏”区域中设置文件夹结构,并且仅通过服务器端脚本(例如,按需复制)访问这些文件夹结构。安全的方法消耗了更多的资源,但为建立技术优化的文件夹结构打开了空间

  • 操作系统限制:每个操作系统限制每个文件夹的项目和/或文件数量。限制的实际数字取决于文件系统的操作系统特定配置。如果我没记错的话,LINUX安装程序支持每个文件夹32000个项目。说到底,这个例子并不重要。然而,重要的是,您的利用率规划不会超过服务器的限制。因此,如果你计划为10个用户提供服务,你可能会有一个文件夹“other”,如果你的目标用户为100万,你可能需要很多文件夹“other”。如果您也不想限制用户上载的文件数量,则可能需要为每个用户扩展文件夹的选项。就我个人而言,我应用的策略是,我的文件夹中的项目不超过1000个

  • 搜索引擎优化要求:如果你的服务需要被搜索引擎优化投诉,它需要能够向用户提供说话的名字-理想情况下没有一般分类,如“个人”/“其他”。您提议的结构可能满足此要求。但是,操作系统的限制可能会迫使您采用更技术性的物理结构(例如,将项目id分为3位,并使用这些数字组成文件夹和文件结构)。除此之外,您还可以实现一个逻辑结构,然后将ID转换为名称。然而,这种实现意味着通过服务器端脚本访问文件,因此需要更多的资源。或者,您可以使用Web服务器url重写

  • 一致性+可用性+分区容差:使您的服务成为一项服务可能需要您根据这些设置进行平衡。将beast分为物理层和逻辑层有很大帮助。一致性+可用性+分区容差将在逻辑层处理。也许是你前进的方向。有关该主题的详细信息

  • ===============================更新

    从这些评论中,我们知道您将元数据存储在关系数据库中,您有物理层(磁盘上的文件)和逻辑层(通过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派生文件,也可以从文件派生用户ID,因此不需要将该关系存储为文件夹结构的一部分。您只需将文件命名为physical layer files.id,这是数据库生成的一个数值。由于ID是由数据库生成的,所以请确保它们是唯一的。现在,您还可以使用标记,为用户提供更丰富的分类体验(如果您不喜欢标记,也可以在数据库中使用文件夹)

    注意第4点对您的设计有很大的影响。如果你在设置好整个过程后小心,你可能会加倍努力。因为所有事情都是从数字ID构建文件,所以将物理文件存储在无sql数据库(而不是文件系统)中的键值存储中是一个非常小的步骤,这使得您的系统可扩展性非常好。这意味着您将为元数据和结构数据使用sql数据库,为文件内容使用nosql数据库


    顺便说一句,为了覆盖您的公共文件,我假设您有一个ID为1的用户“public”。这最终导致一些数据硬编码,这意味着很难看。然而,由于功能“public”是应用程序中的一个核心元素,您可以通过以适当的方式记录它来为不成文的法律做出贡献。或者,您可以添加更多的表,并放大代码,以“干净”的方式覆盖两个不同的内容。

    在我看来,实际使用哪种文件夹结构并不重要。当然(如前所述),存在操作系统和FS限制,您可能需要花一两个时间考虑扩展

    但最后,我会推荐一种更灵活的存储和恢复方法