[file-manager] 分享一个附件上传管理扩展

PHP技术
369
0
0
2022-09-02

file-manager

安装

$ composer require lfyw/file-manager

使用

数据库迁移

执行数据库迁移:

$ php artisan migrate

如果需要对数据表做修改,可以导出迁移文件:

$ php artisan vendor:publish --tag='migrations'

配置

导出配置文件:

$ php artisan vendor:publish --tag='config'

path是文件存放目录;clear_sync_file是指同步完文件,是否删除同步中失效的文件,建议true

return [
    'path' => env('FILE_PATH', 'public/uploads'),
    'clear_sync_file' => env('FILE_CLEAR', true)
];

文件上传

upload($file, $keepOriginalName = false, $guessExtension = true)

像下面这样来上传文件。第一个参数是上传的文件;第二个参数是上传时是否以原文件名进行保存,默认会重新命名;第三个参数是是否根据文件 MIME 类型推测文件后缀,默认true, 如果要保存文件的原后缀名请改为false

class FilesController extends Controller
{
    public function store(Request $request)
    {
        return \Lfyw\FileManager\Models\File::upload($request->file('file'), $keepOriginalName = false, $guessExtension = true);
    }
}

结果会返回一个File模型:

{ 
    "original_name": "开放平台接入协议V1.5.docx", 
    "save_name": "nxSwybO01e6hLooUIS2ClOzxhV1Mhw4easqx2guz.docx", 
    "path": "uploads/nxSwybO01e6hLooUIS2ClOzxhV1Mhw4easqx2guz.docx", 
    "url": "/storage/uploads/nxSwybO01e6hLooUIS2ClOzxhV1Mhw4easqx2guz.docx", 
    "extension": "docx", 
    "extra": { 
        "client_extension": "docx", 
        "clientMineType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
        "extension": "docx", 
        "size": 34003 
    }, 
    "updated_at": "2020-09-28T13:16:56.000000Z", 
    "created_at": "2020-09-28T13:16:56.000000Z", 
    "id": 17
}

文件关联

在目标模型文件中引用HasFilestrait

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Lfyw\FileManager\Traits\HasFiles;

class User extends Authenticatable
{
    use HasFactory, Notifiable, HasFiles;

新增文件关联

attachFiles($param = null, string $type = null)
$user = User::find(1);
$user->attachFiles();//空参数或者会被判定为false的参数(如:[],null)什么都不会做,意味着你无需额外判定参数是否存在或是否为空
$user->attachFiles(1);//关联文件 id 为 1 的文件
$user->attachFiles([1,2]);//可以同时关联多个文件,传递文件的 id 数组
$user->attachFiles(1, 'avatar');//关联一个被标识为 avatar 的文件
$user->attachFiles([1 => 'avatar', 2 => 'background'])//同时关联多个不同标识的文件

同步文件关联

syncFiles($param = null, string $type = null)

接受一个参数替换原本的关联,未在参数中的原关联会被移除。

$user = User::find(1);
$user->syncFiles();//空参数或者会被判定为false的参数(如:[],null)什么都不会做,意味着你无需额外判定参数是否存在或是否为空
$user->syncFiles(1);//同步关联文件 id 为 1 的文件
$user->syncFiles([1,2]);//可以同步关联多个文件,传递文件的 id 数组
$user->syncFiles(1, 'avatar');//同步关联一个被标识为 avatar 的文件
$user->syncFiles([1 => 'avatar', 2 => 'background'])//同步关联多个不同标识的文件

同步不移除

syncFilesWithoutDetaching($param = null, string $type = null)

用法同 syncFiles() 一致,同步的时候不会移除原先的关联

移除关联

detachFiles($param = null, string $type = null)
$user = User::find(1);
$user->detachFiles(1);//移除文件 id 为 1 的关联
$user->detachFiles([1,2]);//移除文件 id 为 1 和 2 的关联
$user->detachFiles(type: 'avatar');//移除标识为 `avatar` 的关联
$user->detachFiles();//移除所有关联

追加文件

addFiles($param = null, string $type = null)
$user = User::find(1);
//追加文件
$user->addFiles(1);
$user->addFiles([2]);
$user->attachFiles();
//兼容链式调用与方法本来的所有传参形式:
$user->addFiles([11 => 'avatar'])->attachFiles(12, 'background');
//同样适用于 syncFiles() syncFilesWithoutDetaching()
$user->addFiles([7 => 'avatar'])->syncFiles(9, 'background');

强制同步

forceSync(bool$param = true)

当使用syncFiles()同步文件时,方法会默认对参数做空判断,如果参数为空则不执行任何操作,从而避免手动判断文件参数是否为空。但在某些情况下,如编辑的时候取消了图片,此时需要将空参数也参与同步关联,可以使用该方法进行强制同步:

public function store(Request $request)
{
    $user = User::find(1);
    $user->forceSync()->syncFiles($request->file_ids);//如果 $request->file_ids 为空,则同步后不关联任何文件。
}

注意:由于syncFilesWithoutDetaching()是同步不移除,所以forceSync()syncFilesWithoutDetaching无效.

预加载

$user = User::withFiles('avatar')->get();

延迟预加载

$user = User::find(1);
$user->loadFiles('avatar');

github

附件上传管理扩展 Github