[file-manager] 分享一個附件上傳管理擴充套件

王小大發表於2022-02-22

安裝

$ 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

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章