站点图标

Laravel生成目录树

2019-03-15折腾记录Laravel / PHP / 目录树
本文最后更新于 410 天前,文中所描述的信息可能已发生改变

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

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

实现原理

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

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

实现代码

FolderModel


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

FolderController


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

Laravel生成目录树

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

    BY-NC-SA

  • 发布于

    2019-03-15

  • 本文作者

    Otstar Lin

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

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