Skip to content

設定參考

發佈並執行 migration 後,FileMagic 可以直接使用預設設定。只有應用程式需要調整 storage、驗證、URL、圖片、ZIP 或遠端下載預設值時,才需發佈設定檔:

bash
php artisan vendor:publish --tag=file-magic-config

設定選項

設定預設值用途
diskFILESYSTEM_DISKlocal未呼叫 onDisk() 時使用的 Filesystem disk。
directoryfiles未呼叫 inDirectory() 時使用的相對目錄。
visibilityprivate未呼叫 visibility() 時使用 privatepublic
max_size104857600偵測後允許的最大檔案 bytes。
allowed_mime_types[]允許的 MIME types;空陣列允許所有未被下列設定封鎖的類型。
blocked_mime_typesPHP MIME types拒絕的 MIME types;可用 blockMimeTypes() 覆寫單一檔案的設定。
collisionunique目標路徑存在時使用 uniqueerroroverwrite
collision_lock.enabledfalse啟用儲存、批次刪除與稽核清理的 cooperative atomic lock。
collision_lock.storenullCollision lock 使用的 cache store;null 使用 Laravel 預設 store。
collision_lock.lease_seconds300Lock lease 的正整數秒數。
collision_lock.wait_seconds10等待競爭中 lock 的正整數秒數上限。
checksum_algorithmsha256計算 checksum 的受支援 PHP hash 演算法。
temporary_url_ttl5Temporary URL 的預設有效分鐘數。
model套件 StoredFileEloquent Model class;自訂 class 必須繼承套件 Model 並使用設定的資料表。
tablestored_filesModel 與已發佈 migration 使用的資料表;自訂 Model 必須設定相同的 $table
image.quality80resizeImage() 未指定品質時使用的輸出品質。
image.max_width1920resizeImage() 未指定寬度時使用的最大寬度。
zip.max_files100單次 ZIP 下載的紀錄數量上限。
zip.max_size1073741824單次 ZIP 下載的未壓縮來源總 bytes 上限。
remote.connect_timeout5fromUrl() 的連線逾時秒數。
remote.timeout30fromUrl() 的完整下載逾時秒數。
remote.max_redirects3Redirect 上限,範圍為 010
remote.allowed_hosts[]精確 public host allowlist;空陣列允許通過 SSRF 檢查的 public hosts。
remote.allowed_ports[80, 443]遠端下載允許使用的非空 destination port 清單。

預設封鎖的 MIME types 是 application/x-httpd-phpapplication/x-php

設定值採嚴格型別,並在使用對應功能時驗證。FileMagic 不會轉換字串整數、移除錯誤的 清單成員,或在設定值無效時回退至預設值。無效值會拋出 InvalidConfiguration,並指出 受影響的 key。未使用的 optional 圖片、ZIP、遠端下載與 temporary URL 設定不會阻擋 其他操作。

升級前請確認數值設定使用 PHP integer 而非數字字串、清單使用連續整數 keys 並包含正確 型別、enum-backed 設定完全符合表列值,而且每個指定 disk 都存在於 filesystems.disks

已執行發佈的 migration 後再修改 table,不會重新命名既有資料。已部署的應用程式應 建立新的 migration。更換 modeltable 時,另請參考 Model 與例外

Optional collision lock 部署

Collision lock 預設停用,因此一般 FileMagic mutation 不要求 cache store 支援 lock。停用模式保留 既有行為,但不保護 concurrent store 與 delete 的 TOCTOU 競爭。將 collision_lock.enabled 設為 true 才會啟用。

啟用後,儲存、批次刪除與稽核清理會共用相同的 canonical disk/path lock。批次操作會以固定 順序取得不同 keys,並在 mutation 前重新確認目前的 database identity。請使用支援 atomic lock 的 Laravel cache store:Redis、Memcached、DynamoDB、database、file 或 array。 找不到或不支援 lock 的 store 會被拒絕。停用時不會解析或驗證 storelease_secondswait_seconds

所有已啟用 lock 且可能寫入相同 storage path 的應用程式 processes 必須使用同一個共享 cache backend。Array store 只適合單一 process 測試;file store 只有在多台伺服器確實共享 同一 filesystem 時才能跨機協調。lease_seconds 應長於最壞情況下 multi-lock wait、storage I/O、 reconciliation、database mutation 與 recovery 的總時間。儲存等待逾時會拋出 FileWriteFailed; 批次刪除回報 PartialFileDeletion,稽核清理則以 exit code 2 結束。Lock 設定無效會在檢查或 變更目標前拋出 InvalidConfiguration

環境變數

套件提供的設定檔會讀取以下環境變數:

dotenv
FILE_MAGIC_DISK=s3
FILE_MAGIC_DIRECTORY=uploads
FILE_MAGIC_VISIBILITY=private

FILE_MAGIC_DISK 會回退至 Laravel 的 FILESYSTEM_DISK。其他選項可在發佈後的 config/file-magic.php 修改。

Last updated:

使用 MIT License 發佈。