安裝
$ 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
}
檔案關聯
在目標模型檔案中引用HasFiles
trait
<?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
本作品採用《CC 協議》,轉載必須註明作者和本文連結