【问题标题】:Directory structure for large number of files大量文件的目录结构
【发布时间】:2012-03-22 12:07:13
【问题描述】:

我创建了一个站点...我将用户上传的文件存储在单独的目录中,例如
用户 ID = 1
所以
img/upload_docs/1/1324026061_1.txt
img/upload_docs/1/1324026056_1.txt

同样的方式,如果
用户 ID = 2
所以
img/upload_docs/2/1324026061_2.txt
img/upload_docs/2/1324026056_2.txt
...
n

所以现在如果将来我将获得 100000 个用户,那么在我的 upload_docs 文件夹中我将拥有 100000 个文件夹。
并且对用户上传没有限制,因此可以是 1 个用户的 1000 个文件或任意数量的文件的 10 个文件...

这是正确的方法吗? 或者如果没有,那么任何人都可以建议我如何将这些文件存储在这种结构中???

【问题讨论】:

    标签: php filesystems directory


    【解决方案1】:
    img/upload_docs/1/0/10000/1324026056_2.txt
    img/upload_docs/9/7/97555/1324026056_2.txt
    img/upload_docs/2/3/23/1324026056_2.txt
    

    【讨论】:

    • 你能解释一下你的答案吗???因为我没有得到这个 1/0/10000 和 9/7/97555 和 2/3/23 ...那些是指什么???
    • 真丢脸,我认为这很明显。
    【解决方案2】:

    我要做的是命名图像 UUID 并根据文件名创建子文件夹。您可以使用chunk_split 轻松完成此操作。例如,如果您每 4 个字符创建一个文件夹,您最终会得到如下结构:

    img/upload_docs/1/1324/0260/61_1.txt 
    img/upload_docs/1/1324/0260/56_1.txt 
    

    通过存储图像名称 1324026056_1.txt,您可以使用chunk_split 轻松确定它属于哪里或从哪里获取它。

    这与 git 存储对象的方式类似。

    作为代码,它可能看起来像这样。

    // pass filename ('123456789.txt' from db)
    function get_path_from_filename($filename) {
        $path = 'img/upload_docs';
        list($filename, $ext) = explode('.', $filename); //remove extension
        $folders = chunk_split($filename, 4, '/'); // becomes 1234/5678/9
        // now we store it here
        $newpath = $path.'/'.$folders.'/'.$ext;
        return $newpath;
    }
    

    现在,当您搜索文件以将其交付给用户时,使用函数使用这些步骤重新创建文件所在的位置(基于在数据库中仍存储为“123456789.txt”的文件名)。

    现在要交付或存储文件,请使用get_path_from_filename

    【讨论】:

    • 这将是一个包含 10000 个文件的目录,这似乎不是很好的解决方案。
    • 不,它最终会是几个目录,每个目录都有几个文件。如果它适用于 git 存储数千个对象,为什么它不适用于拥有多张图像的 10000 个用户?
    • 啊,我明白你的错误了。重新阅读问题 - 重要的不是图像名称;)
    • 阅读我的答案 - 图像名称仅指示文件夹结构。这将以单个文件夹中不会有 100000 个文件夹的方式拆分文件夹结构。
    • 阅读我的评论。图片名称不代表任何内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2013-04-13
    • 2017-03-28
    • 2013-12-15
    • 1970-01-01
    • 2022-01-10
    • 2013-11-13
    相关资源
    最近更新 更多