惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
N
News and Events Feed by Topic
Recent Announcements
Recent Announcements
D
Docker
M
MIT News - Artificial intelligence
L
LangChain Blog
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
博客园_首页
MongoDB | Blog
MongoDB | Blog
美团技术团队
S
Schneier on Security
G
GRAHAM CLULEY
月光博客
月光博客
有赞技术团队
有赞技术团队
Vercel News
Vercel News
Scott Helme
Scott Helme
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Recorded Future
Recorded Future
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
Google Online Security Blog
Google Online Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
量子位
S
Security @ Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
L
Lohrmann on Cybersecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Security Affairs
Cloudbric
Cloudbric
爱范儿
爱范儿
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives

青空之蓝

[青空之蓝-2023] - 色彩 | 青空之蓝 [青空之蓝-2022] - 平静 | 青空之蓝 [青空之蓝-2021] - 远望 | 青空之蓝 浅谈垃圾回收 | 青空之蓝 浅谈泛型擦除 | 青空之蓝 浅谈单点登录 | 青空之蓝 使用 Kotlin 编写 Spring 测试 | 青空之蓝 设计模式系列文章 | 青空之蓝 从零实现一个 Java 微框架 - IoC | 青空之蓝 从零实现一个 Java 微框架 - 前言 | 青空之蓝 浅谈 JVM:类加载 | 青空之蓝 浅谈 IO | 青空之蓝 浅谈并发:synchronized & ReentrantLock | 青空之蓝 浅谈并发:CAS & AQS | 青空之蓝 浅谈并发:ThreadLocal | 青空之蓝 浅谈并发:三大特性 | 青空之蓝 浅谈组合注解 & 注解别名 | 青空之蓝 [青空之蓝-2020]-迷茫 | 青空之蓝 Java 系列文章 | 青空之蓝 HTTP 系列文章 | 青空之蓝 浅谈 EatWhatYouKill | 青空之蓝 浅谈可扩展线程池 | 青空之蓝 聊聊写框架 | 青空之蓝 聊聊现状-[2020-09] | 青空之蓝 浅谈并发:锁 | 青空之蓝 浅谈并发:基础 | 青空之蓝 浅谈缓存 | 青空之蓝 无须定义类,Spring 快速注入 Json 参数 | 青空之蓝 浅谈 Proxy 和 Aop | 青空之蓝 从零实现一个 PHP 微框架 - 初始化请求 | 青空之蓝 为 Vue3 添加一个简单的 Store | 青空之蓝 从零实现一个 PHP 微框架 - 服务提供者 | 青空之蓝 WSL2 踩坑记录 | 青空之蓝 浅谈浏览器Event Loop [更新] | 青空之蓝 从零实现一个 PHP 微框架 - Bootstrap 启动加载 | 青空之蓝 从零实现一个 PHP 微框架 - IoC 容器 | 青空之蓝 从零实现一个 PHP 微框架 - PSR & Composer | 青空之蓝 从零实现一个 PHP 微框架 - 前言 | 青空之蓝 MVVM 简单实现 | 青空之蓝 浅谈 DI 和 IoC | 青空之蓝 中间件实现 [PHP] | 青空之蓝 告别 Windows 终端的难看难用,打造好用的 PowerShell | 青空之蓝 VSCode Java输出中文乱码问题解决[更新] | 青空之蓝 浅谈浏览器渲染 | 青空之蓝 Vue-Cli@2 项目迁移日志 | 青空之蓝 Laragon & Scoop 集成踩坑记录 | 青空之蓝 「一行代码」优雅管理 Windows 软件 | 青空之蓝 [青空之蓝-2019]-年度总结 | 青空之蓝 为Vue添加简单的Store | 青空之蓝 为React添加简单的Store | 青空之蓝 为Vuex添加同步Action | 青空之蓝 浅谈B+树 | 青空之蓝 浅谈跳表 | 青空之蓝 浅谈数据库索引 | 青空之蓝 MySQL事务隔离 | 青空之蓝 算法复杂度分析(1) | 青空之蓝 一年来的经验总结 | 青空之蓝 Acrylic - VSCode Extension | 青空之蓝 ace编辑器设置惯性滚动 | 青空之蓝 Java二叉树实现 | 青空之蓝 Java图实现 | 青空之蓝 为apt方式安装的nginx重新编译增加WebDAV | 青空之蓝 XK-Editor - 一个支持富文本和Markdown的编辑器 | 青空之蓝 JS生成列表树 | 青空之蓝 XK-Note - 集各种神奇功能的云笔记 | 青空之蓝 PHP GD生成验证码 | 青空之蓝 PHP GD图片处理[转换格式-水印-缩略图] | 青空之蓝 Origami - 简洁轻快的WordPress主题 | 青空之蓝 为WordPress启用WorkBox | 青空之蓝 [青空之蓝-2018]-年度总结 | 青空之蓝 VSCode Java手动导入jar和源码包 | 青空之蓝 Windows IP变化自动发送邮件 | 青空之蓝 C链表实现重制版 | 青空之蓝 C 结构体的定义和使用 | 青空之蓝 图的搜索(遍历) - BFS & DFS | 青空之蓝 Java链表实现 | 青空之蓝 C 快速排序 | 青空之蓝 C 插入排序 | 青空之蓝 C 归并排序 | 青空之蓝 C语言链表实现 | 青空之蓝 VSCode配置Java调试环境[Windows] | 青空之蓝 C 选择排序 | 青空之蓝 C 冒泡排序 | 青空之蓝 VSCode配置PHP调试环境[Windows] | 青空之蓝 VSCode配置C/C++ GDB调试环境[Windows] | 青空之蓝 WordPress友情链接模板 | 青空之蓝 Intel Optane 傲腾内存体验 | 青空之蓝 Mysql双机热备实战 | 青空之蓝 博客一年记录 | 青空之蓝 为WordPress启用Service Worker | 青空之蓝 Bing每日一图API | 青空之蓝 iframe延迟加载 | 青空之蓝 写在2018年高考前 | 青空之蓝 The Fox主题汉化分享 | 青空之蓝 [青空之蓝-2017]-崭新 | 青空之蓝 本博客评论规则 | 青空之蓝 世界,您好! | 青空之蓝
Laravel生成目录树 | 青空之蓝
Otstar Lin · 2019-03-15 · via 青空之蓝

在 XK-Note 项目中由于需要读取取所有文件夹和所有文件,但是 Laravel 并没有提供生成目录树的函数,所以只能自己动手丰衣足食。ㄟ( ▔, ▔ )ㄏ

Laravel 提供了一个强大的文件系统抽象,我们可以直接使用,这样就不会使目录树只支持从本地存储生成。

实现原理

Laravel 内置了 Storage::files($directory)可以读取指定目录下的文件并生成一个索引数组, Storage::directories($directory)可以读取指定目录下的子目录并生成索引数组,利用这两个函数就可以将指定文件夹下的所有文件和所有子文件夹的信息都存入数组中,然后可以递归提取出来的子文件夹进行深层查找,直到没有子文件夹为止,但是这样提取出来的数组会变得乱七八糟的,在生成目录列表的时候就不容易,所以要在递归的同时修改生成的索引数组。

生成的目录树结构如上,当 key 为数字时则代表 value 为文件,当 key 为字符串时则代表 value 为文件夹。

实现代码

FolderModel

namespace App\Http\Models;
use Illuminate\Support\Facades\Storage;

class FolderModel
{
    /**
     * 获取文件夹树
     */
    public function get_folders($dir = "")
    {
        $dirs = Storage::directories($dir);
        $dira = Storage::files($dir);
        foreach ($dirs as $name) {
            array_splice($dirs, 0, 1);
            if(Storage::directories($name) == []) {
                $dirs[$name] = Storage::files($name);
            } else {
                $dirs[$name] = $this->get_folders($name);
                array_merge($dirs[$name],Storage::files($name));
            }
        }
        foreach ($dira as $num => $value) {
            $dirs[$num] = $value;
        }
        return $dirs;
    }
}
namespace App\Http\Models;
use Illuminate\Support\Facades\Storage;

class FolderModel
{
    /**
     * 获取文件夹树
     */
    public function get_folders($dir = "")
    {
        $dirs = Storage::directories($dir);
        $dira = Storage::files($dir);
        foreach ($dirs as $name) {
            array_splice($dirs, 0, 1);
            if(Storage::directories($name) == []) {
                $dirs[$name] = Storage::files($name);
            } else {
                $dirs[$name] = $this->get_folders($name);
                array_merge($dirs[$name],Storage::files($name));
            }
        }
        foreach ($dira as $num => $value) {
            $dirs[$num] = $value;
        }
        return $dirs;
    }
}

FolderController

amespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Models\FolderModel;

class FolderController extends Controller
{
    /**
     * 文件夹html
     */
    public $out;
    public function get_folders($dir)
    {
        global $out;
        $folder = new FolderModel();
        $arr = $folder->get_folders($dir);
        $this->print_folders($arr, "");
        return $out;
    }
    /**
     * 将文件夹树生成html
     * @param Array $arr 文件夹树
     */
    public function print_folders($arr)
    {
        global $out;
        if($arr !== []) {
            foreach ($arr as $dir => $file) {
                if(gettype($dir) == 'integer') {
                    if(strrpos($file, '/') !== false) {
                        $file_name = substr($file, strrpos($file, '/') + 1);
                    } else {
                        $file_name = $file;
                    }
                    if(preg_match("/(.txt|.md)/i", $file_name)) {
                        $file = str_replace('uid_'.Auth::id().'/', '', $file);
                        $li_id = str_replace('.', '', $file);
                        $li_id = str_replace('/', '', $li_id);
                        $out .= '<li dir="'.$file.'" id="'.$li_id.'" class="dc"><a href="#"><i class="icon icon-file-text"></i>'.$file_name.'</a></li>';
                    }
                } else {
                    $dir = str_replace('uid_'.Auth::id().'/', '', $dir);
                    $dir_old = $dir;
                    if(strrpos($dir, '/') !== false) {
                        $dir = substr($dir, strrpos($dir, '/') + 1);
                    }
                    $out .= '<li dir="'.$dir_old.'" class="dp"><a href="#"><i class="icon icon-folder-close"></i>'.$dir.'</a><ul>';
                    $out .= $this->print_folders($file);
                    $out .= '</ul>';
                }
            }
        }
        $out .= '</li>';
    }
}
amespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Models\FolderModel;

class FolderController extends Controller
{
    /**
     * 文件夹html
     */
    public $out;
    public function get_folders($dir)
    {
        global $out;
        $folder = new FolderModel();
        $arr = $folder->get_folders($dir);
        $this->print_folders($arr, "");
        return $out;
    }
    /**
     * 将文件夹树生成html
     * @param Array $arr 文件夹树
     */
    public function print_folders($arr)
    {
        global $out;
        if($arr !== []) {
            foreach ($arr as $dir => $file) {
                if(gettype($dir) == 'integer') {
                    if(strrpos($file, '/') !== false) {
                        $file_name = substr($file, strrpos($file, '/') + 1);
                    } else {
                        $file_name = $file;
                    }
                    if(preg_match("/(.txt|.md)/i", $file_name)) {
                        $file = str_replace('uid_'.Auth::id().'/', '', $file);
                        $li_id = str_replace('.', '', $file);
                        $li_id = str_replace('/', '', $li_id);
                        $out .= '<li dir="'.$file.'" id="'.$li_id.'" class="dc"><a href="#"><i class="icon icon-file-text"></i>'.$file_name.'</a></li>';
                    }
                } else {
                    $dir = str_replace('uid_'.Auth::id().'/', '', $dir);
                    $dir_old = $dir;
                    if(strrpos($dir, '/') !== false) {
                        $dir = substr($dir, strrpos($dir, '/') + 1);
                    }
                    $out .= '<li dir="'.$dir_old.'" class="dp"><a href="#"><i class="icon icon-folder-close"></i>'.$dir.'</a><ul>';
                    $out .= $this->print_folders($file);
                    $out .= '</ul>';
                }
            }
        }
        $out .= '</li>';
    }
}

Laravel生成目录树

https://blog.ixk.me/post/laravel-generating-directory-tree
  • 许可协议

    BY-NC-SA

  • 本文作者

    Otstar Lin

  • 发布于

    2019/03/15

转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!

JS生成列表树XK-Note - 集各种神奇功能的云笔记

HomeGitHubStatus

Copyright © 2017-2026 Otstar Lin

Theme Coline by Otstar LinPowered by Next.js