Skip to main content

檔案儲存是什麼

Laravel 提供強大的檔案系統抽象層,底層基於 PHP 套件 Flysystem。 它讓你能以相同的 API 操作本機磁碟、SFTP、Amazon S3 等各種不同的儲存後端,因此可依環境切換而不必修改程式碼
即使切換驅動,程式碼也無須改變。開發環境用本機、正式環境用 S3 這種配置能輕鬆實現。

設定

檔案系統的設定集中在 config/filesystems.php。 你可以在此定義「磁碟」。磁碟是特定驅動與儲存位置的組合。 主要驅動如下:

local 驅動

使用 local 驅動時,會以 filesystems 設定的 root 目錄為基準操作檔案。 預設 rootstorage/app/private

變更預設磁碟

透過 FILESYSTEM_DISK 環境變數切換預設磁碟。

public 磁碟與符號連結

public 磁碟用來放置可從 Web 存取的檔案。 預設會存放於 storage/app/public 目錄。 要讓 Web 伺服器能存取,請建立從 public/storagestorage/app/public 的符號連結。
1

建立符號連結

2

取得檔案的 URL

建立符號連結後,可用 asset 輔助函式產生 URL。
若需要額外的符號連結,可在 config/filesystems.phplinks 陣列設定。
要移除符號連結請使用 storage:unlink

Storage Facade 基本操作

讀取檔案

寫入檔案

put 失敗時,預設會回傳 false。 在磁碟設定中加入 'throw' => true 可改為拋出例外。

刪除檔案

檔案下載回應

URL 產生

一般 URL

local 驅動會回傳如 /storage/file.jpg 的相對 URL。 s3 驅動會回傳完整的遠端 URL。

臨時 URL(Temporary URL)

若想產生具有效期限的 URL,可使用 temporaryUrl。 可用於 locals3 驅動。
在 S3 也可指定額外的請求參數。
若需臨時上傳 URL 則使用 temporaryUploadUrl。 適用於前端直接上傳到 S3 的無伺服器架構。

檔案上傳

以下是儲存使用者透過表單上傳檔案的常見流程。

store 方法(自動產生檔名)

storeAs 方法(指定檔名)

指定磁碟上傳

透過 Storage Facade 上傳

getClientOriginalName()getClientOriginalExtension() 可被使用者篡改,並不安全。 檔名請用 hashName(),副檔名請用 extension()

檔案可見性(Visibility)

Flysystem 以 visibility 管理檔案是否公開。
若要以公開狀態儲存上傳檔案,使用 storePublicly

使用多個磁碟

disk 方法可切換操作的磁碟。

雲端儲存(S3)的設定

安裝套件

設定環境變數

.env 檔設定 S3 認證資訊。
DigitalOcean Spaces、Cloudflare R2、Vultr Object Storage 等 S3 相容服務也可透過 s3 驅動使用。 請在 endpoint 選項指定服務的端點 URL。

取得檔案 meta

目錄操作

測試

使用 Storage::fake(),可撰寫不觸及真實磁碟的檔案測試。
使用 UploadedFile::fake()->image() 需要 PHP 的 GD 擴充

實戰範例:上傳個人頭像

以下整合驗證、儲存與寫回 DB 的實戰控制器範例。
在樣板中使用 Storage::url() 取得 URL:
最後修改於 2026年8月2日