圖片處理工具 spatie/laravel-medialibrary 使用教學

[spatie/laravel-medialibrary](https://spatie.be/docs/laravel-medialibrary/ "spatie/laravel-medialibrary") 這個工具很強大,但因為官網的文件寫太爛,得花很多時間自己研究才能符合我自己日常工作的實際情境,以及官網忽略太多其他地方設定的雷區,因此寫這份文件做紀錄,希望幫到未來的自己。

補充:這個工具版本很容易一升版就有 breaking change,其實蠻煩的,請注意自己的版本是否跟我這邊寫的一樣。

安裝 spatie/laravel-medialibrary

要注意不同的 PHP 版本要安裝不同版本的 spatie/laravel-medialibrary

PHP 8.2:v11
PHP 8.1:v10

以下是 PHP 8.1 & v10 的操作方式

composer require "spatie/laravel-medialibrary"
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="migrations"
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="config"
php artisan migrate

使用 AWS 或是任何 S3 Compatible 的服務

Laravel Media Library 是依賴於 Laravel FileSystem 類別,底層是使用 league/flysystem-aws-s3-v3

composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies

接著在 .env 檔案中設定以下參數

AWS_ACCESS_KEY_ID=<your-key-id>
AWS_SECRET_ACCESS_KEY=<your-secret-access-key>
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=<your-bucket-name>
AWS_USE_PATH_STYLE_ENDPOINT=false

請記得 config/filesystem.php 中,目標的 S3 Disk 須設定 visibility => 'public' 這樣傳上去的圖片才會是公開的。

如何正確設定 AWS S3 Bucket 權限

如果你是使用 S3,請依照以下步驟設定資料夾權限

  1. 請設定 ACLs enabled 讓程式可以控制存取權限
  2. 請設定 Block all public access 為 off
  3. 請設定指定資料夾 Make public using ACL

如何指定 Bucket 底下的不同儲存資料夾?

config/filesystems.php 中,可以設定 urlroot 的參數,這樣就可以指定不同的資料夾