artincms/laravel_file_manager

ArtinCMS.com 官方 Laravel 文件管理器包

dev-master 2021-05-30 07:45 UTC

This package is auto-updated.

Last update: 2024-09-29 05:02:01 UTC


README

laravel file manager 是一个用于管理用户上传文件并检查 ACL 的包。

  • 你可以上传自定义大小的文件,生成下载链接,将文件存储在存储文件夹中,优化图像。
  • 生成下载链接
  • 将文件存储在存储文件夹中
  • 优化图像
  • 在上传文件、编辑文件或生成链接时,可以三种裁剪方式裁剪图像。

要求

  • PHP >= 7.0
  • Laravel 5.5|5.6
如果你想要启用优化,该包将使用以下优化器

安装

快速安装

composer require "artincms/laravel_file_manager"
适用于 Laravel 小于 5.5
在你的 config/app.php 文件中注册提供者和外观。
'providers' => [
    ...,
    ArtinCMS\LFM\LFMServiceProvider::class,
]
'aliases' => [
    ...,
    'FileManager' => ArtinCMS\LFM\Facades\FileManager::class,
]
发布供应商
 $ php artisan vendor:publish --provider="ArtinCMS\LFM\LFMServiceProvider"
如果你更新了包并需要发布供应商,你应该运行
 $ php artisan vendor:publish --provider="ArtinCMS\LFM\LFMServiceProvider" --force
迁移表
  $ php artisan migrate
  
向 lfm_file_mime_type 表中添加种子数据
  php artisan db:seed --class="ArtinCMS\LFM\Database\Seeds\FilemanagerTableSeeder"
  

更多安装详情

如果系统上有这些优化器,该包将使用它们

在你的服务器上安装此包

以下是在 Ubuntu 上安装所有优化器的方法

  sudo apt-get install jpegoptim
  sudo apt-get install optipng
  sudo apt-get install pngquant
  sudo npm install -g svgo
  sudo apt-get install gifsicle

以下是安装 MacOS 上的二进制文件的方法(使用 Homebrew

  brew install jpegoptim
  brew install optipng
  brew install pngquant
  brew install svgo
  brew install gifsicle

要启用包中的优化器,你应该进入 config/laravel_file_manager.php 并设置 'Optimise_image'= true

有关更多信息,您可以访问 image-optimizer

用法

要使用此包,你应该在任何地方使用以下辅助函数,例如在你的控制器中。这个辅助函数
  • 创建用于显示管理器的 HTML 模态框
  • 创建 HTML 模态框按钮
  • 设置你的选项
    LFM_CreateModalFileManager($section, $options , $insert , $callback , $modal_id , $header , $button_id, $button_content)
  

其中 $section 是必需的,其他输入是可选的。要使用文件管理器的输出,你应该安装 jQuery 3 和 Bootstrap 4;

  • $section = 部分名称,例如 'FileManager';
  • $options : 是你想要在此包中实现的选项,例如
        $options = ['size_file' => 100, 'max_file_number' => 30, 'true_file_extension' => ['png','jpg']];
        
  • $insert : 使用此选项,你可以将此包用作文件选择器。默认值是 'insert' ;
  • $callback : 此选项提供 JavaScript 回调函数名称。例如,你可以获取选定的文件并显示它
      //the inserted file result is 
      {
        Manager :
            available:1,
            data :
            [{
                0 :
                {
                    file :
                    {
                        height : "0"
                        icon : "image"
                        id : 115
                        name : "photo2017-04-1512-45-2"
                        quality : "100"
                        size : 60187
                        type : "original"
                        user : "faramarz"
                        version : null
                        width:  "0"
                    },
                    full_url: "http://127.0.0.1:8000/LFM/DownloadFile/ID/115/original/404.png/100/0/0",
                    message: "File with ID :115 Inserted",
                    success:true
                    url: "/LFM/DownloadFile/ID/115/original/404.png/100/0/0",
                    full_url_large:"http://127.0.0.1:8000/LFM/DownloadFile/ID/24/small/404.png/100/300/180",
                    full_url_medium:"http://127.0.0.1:8000/LFM/DownloadFile/ID/24/medium/404.png/100/300/180",
                }
            }],
            view :
            {
               'list' : 'html grid view code' ,
               'grid' : 'html grid view code' ,
               'small' :'html small view code' ,
               'medium' : 'html thumb view code' ,
               'large' : 'html large view code' 
            }
      }  
    //to show above data to small view you can use this function  
    function callback(result)
    {
       $('#show_area_small').html(result.Manager.view.small) ;
    }
      
    Manager 是部分名称。为了显示插入的文件,此包提供了 4 种视图。你可以在回调函数中调用这些视图,如上述示例所示。插入的视图是:list、grid、small、medium、large
  • $modal_id : 此选项用于为主模态框分配 id,默认为 'FileManager' .
  • $header : 此选项用于设置模态框标题。默认为 'File manager' .
  • $button_id :此选项用于为主模态框按钮分配 id,默认为 'show_modal' .
  • $button_content : 此选项用于为主模态框按钮分配名称,默认为 'input file' .

你可以通过:http://www.yourdomain.com/LFM/ShowCategories 访问文件管理器

辅助函数

在本节中,我们描述了一些最有用的函数。你可以在项目中使用这些函数。

保存文件

在您的项目中保存文件,您可以使用 LFM_SaveMultiFile 和 LFM_SaveSingleFile。下面我们将解释这两个函数。

保存多个文件

这个助手用于在可文件表(fileable table)中保存多个插入的文件。
  $res = LFM_SaveMultiFile($obj_model, $section, $type , $relation_name , $attach_type)
 
首先,您应该在模型中定义您的形态关系(morph relation)。我们创建文件关系并将其放入 trait 中。为了使用这个关系,您应该在模型中使用它。
   public function files()
   {
          return $this->morphToMany('ArtinCMS\LFM\Models\File' , 'fileable','lfm_fileables','fileable_id','file_id')->withPivot('type')->withTimestamps() ;
   }
 
您可以使用这个 trait 或创建自己的形态关系。$obj_model 是您的模型名称,$section 是您的小节名称,$type 是文件的类型(如音乐、图片、zip 等),它是可选的,默认为 null,$relation_name 是形态关系的名称,默认为 'files',并且使用 $attach_type 您可以选择附加或同步文件。

保存单个文件

如果您想在多对一关系中保存文件并将文件_id 保存到您的表模型中,您应该使用这些助手。
 LFM_SaveSingleFile($obj_model, $column_name, $section,$column_option_name)
 
$obj_model 是您的模型名称(如 $article = new Article),column_name 是您想保存插入 id 的列名称,例如 'default_img_file_id',$section 是小节名称,$column_option_name 是保存选项的列名称(例如以 json 格式保存宽度、高度、质量等)。

直接上传

如果您想在特定路径上传文件,您可以使用这个助手。
  LFM_CreateModalUpload($section, $callback , $options, $result_area_id , $modal_id , $header , $button_id , $button_content)
  
输入助手函数与 LFM_CreateModalFileManager 相同,但具有不同的 $result_area_id,用于定义上传文件时的区域 ID。您应该在选项中定义您喜欢的路径,如下所示。
           $options = ['size_file' => 1000, 'max_file_number' =>5, 'min_file_number' => 2,'show_file_uploaded'=>'medium', 'true_file_extension' => ['png','jpg','zip'],'path'=>'myuploads/sdadeghi'];
   

加载文件

加载多个文件

  for load files (for example you can use this helper functons when you want edit) you can use this helpers function
  LFM_LoadMultiFile($obj_model, $section, $type = null, $relation_name = 'files')
 
这个助手函数的输入与 LFM_SaveMultiFile 相同,您可以获取文件。记住,您应该在保存和加载文件时使用相同的 section 名称。您可以在加载文件后删除文件或插入新文件。

加载单个文件

对于加载单个文件,您可以如下使用这个助手:
 LFM_loadSingleFile($obj_model, $column_name, $section, $column_option_name = false)
 
这个助手函数的输入与 LFM_SaveSingleFile 相同。只是记得您在保存和加载文件时应该使用相同的 section 名称。您可以在加载文件后删除文件或插入新文件。

显示文件

显示多个文件

要显示插入的文件,您可以使用这个助手函数。
    LFM_ShowMultiFile($obj_model, $type, $relation_name )  
 
与 LFM_LoadMultiFile 的不同之处在于,您不能删除文件。

显示单个文件

要显示单个文件,您可以使用这个助手函数。记住,您不能删除文件。
LFM_ShowingleFile($obj_model, $column_name, $column_option_name)

生成链接

生成下载链接

使用下面的助手函数,您可以在项目的任何位置生成下载链接。
 LFM_GenerateDownloadLink($type, $id , $size_type, $default_img, $quality , $width, $height)
   
  • 如果您想通过 ID 生成文件链接,则 $type = 'ID';如果您想通过名称生成,则可以使用 $type = 'Name'。
  • $id:如果您想通过 ID 生成链接,则应在此项中填写文件 ID,默认为 -1,表示未选择任何文件 ID。
  • $size_type 可以选择以下之一:original,large,medium,small,这表示您想下载哪个大小的文件。
  • 如果未找到与 $default_img 相关的图像,您可以选择要显示的图像,默认为 '404.png'。
  • $quality 是图像的质量,介于 0 和 100 之间。
  • $width 是结果图像的宽度。
  • $height 是结果图像的高度。

生成 Base64 图像

使用以下辅助函数,您可以创建Base64图像。
 LFM_GetBase64Image($file_id, $size_type, $not_found_img , $inline_content , $quality , $width , $height )    
此辅助函数的配置如上所示,但使用不同的$inline_content。如果它为真,您就可以创建Base64图像。

生成公开链接

如果您从存储/public_folder在您的公共文件夹中创建快捷方式,您可以直接访问文件。如以下框所示,您可以使用此辅助函数创建公共下载路径
    LFM_GeneratePublicDownloadLink($path,$filename)     
$psth是文件路径,$filename是磁盘文件名。例如,您想访问网站标志图片,您可以将此文件上传到公共文件夹,并使用上述辅助函数直接访问。

自定义配置

如果您想自定义配置,您可以按照您的要求更改config/laravel_file_manager.php文件。

  • 'private_middlewares'和'public_middlewares'描述了应分配给私有和公开路由的中件,您可以添加auth和其他您想要的中件。
  • 使用'private_route_prefix'和'public_route_prefix',您可以更改私有和公开路由的前缀。
  • 'allowed'指的是可以上传的文件类型。
  • 'allowed_pic'指的是被识别为图片的文件类型。
  • 使用'size_large'、'size_medium'、'size_small'和'size_preview',当上传文件时,您可以根据类型定义上传的大小。
  • 'driver_disk'是您在项目中使用的驱动器。
  • 'user_model'是您的用户模型路径。
  • 'Optimise_image'如果为真,并且配置与安装部分所述一致,则所有图片在存储之前都将进行优化。
  • 使用'crop_type',您可以选择在上传文件时(当创建大、中、小尺寸的图片时)使用哪种裁剪类型。您可以将它设置为以下之一:fit、resize和smart,其中'fit'是默认裁剪,resize会根据您设置的配置大小调整图像,而smart是智能裁剪,但比其他裁剪类型慢。

示例

完整示例
LFM_SaveMultiFile和LFM_SaveSingleFile的示例

在这个例子中,我们将zip文件和用户个人资料图片分配给文章并保存。首先,在路由中

 Route::get('/MultiFile', 'HomeController@multiSection')->name('multiSection');
 Route::get('/MultiFile/{id}', 'HomeController@multiSectionEdit')->name('multiSectionEdit');
 Route::get('/ShowMultiFile/{id}', 'HomeController@showMultiFile')->name('showMultiFile');
 Route::post('/StoreArticle', ['as' => 'StoreArticle', 'uses' => 'HomeController@StoreArticle']);
 Route::post('/StoreEditArticle', ['as' => 'StoreEditArticle', 'uses' => 'HomeController@StoreEditArticle']);
您应该在文章模型中定义您的关联
use ArtinCMS\LFM\Traits\lfmFillable ;
use ArtinCMS\LFM\Models\File;
class Article extends Model
{
    use lfmFillable;
}
如您所见,多部分路由用于保存带有zip文件和个人资料图片的文章。在您的控制器中
    public function multiSection()
    {
            $optionsAttach = ['size_file' => 100, 'max_file_number' => 5, 'true_file_extension' => ['zip']];
            $option_single = ['size_file' => 100, 'max_file_number' => 1, 'true_file_extension' => ['png','jpg']];
            $attach =  LFM_CreateModalFileManager('Attach',$optionsAttach , 'insert','showAttach');
            $single = LFM_CreateModalFileManager('Single',$option_single , 'insert','showSingle');
            return view('multiSection',compact('attach','single'));
    }
    
     public function multiSectionEdit($id)
    {
        $optionsAttach = ['size_file' => 100, 'max_file_number' => 5, 'true_file_extension' => ['zip']];
        $option_single = ['size_file' => 100, 'max_file_number' => 1, 'true_file_extension' => ['png','jpg']];
        $attach =  LFM_CreateModalFileManager('Attach',$optionsAttach , 'insert','showAttach');
        $article = Article::find($id);
        $load_attch = LFM_LoadMultiFile($article,'Attach','zip','files') ;
        $single = LFM_CreateModalFileManager('Single',$option_single , 'insert','showSingle');
        $load_single = LFM_loadSingleFile($article,'default_img_file_id','Single');
        return view('multiSectionedit',compact('attach','single','load_attch','load_single','article'));
    }
    
    public function showMultiFile ($id)
    {
        $article = Article::find($id);
        $show_attch = LFM_ShowMultiFile($article,'zip','files') ;
        $show__single = LFM_ShowingleFile($article,'default_img_file_id','Single');
        return view('showMultiFile',compact('show_attch','show__single','article'));
    }
    
    public function StoreArticle(Request $request)
    {
        $article = new Article ;
        $article->title = $request->title ;
        $article->body = $request->body ;
        $article->save() ;
        $res['Attach'] = LFM_SaveMultiFile($article,'Attach','zip','files' , 'attach');
        $res['Single'] = LFM_SaveSingleFile($article,'default_img_file_id','Single','options');
        return $res ;
    }
    
    public function StoreEditArticle(Request $request)
    {
        $article =Article::find($request->id);
        $res['Attach'] = LFM_SaveMultiFile($article,'Attach','zip','files' , 'sync');
        $res['Single'] = LFM_SaveSingleFile($article,'default_img_file_id','Single','options');
        return $res ;
    }
    

并在multisection.blade.php中

    {!! $attach['button'] !!}
    {!! $attach['modal_content'] !!}
   div#show_area_Attach_list
     function showAttach(res) {
        $('#show_area_Attach_list').html(res.Attach.view.list) ;
        $('#show_area_Attach_grod').html(res.Attach.view.grid) ;
        $('#show_area_Attach_small').html(res.Attach.view.small) ;
        $('#show_area_Attach_medium').html(res.Attach.view.medium) ;
        $('#show_area_Attach_large').html(res.Attach.view.large) ;
        }

以及在multisectioneditl.blade.php中

    {!! $attach['button'] !!}
    {!! $attach['modal_content'] !!}
    div#show_area_Attach  {!! $load_attch['view']['list'] !!}
  function showAttach(res) {
        $('#show_area_Attach').html(res.Attach.view.list,'slider') ;
    }