在 Laravel 中使用 Cloudflare R2 Storage

程式技術
•

最近在寫一些個人專案時,開始嘗試使用 Cloudflare R2 做為雲端存儲空間,原因無他,就是因為便宜,根據官網的比較,R2 的 Free Tier 在容量與讀取次數上都優於 S3,即使超過 Free Tier,在出站費用(Egress Fees)上也是完全不收費的,實在是相當的香。

雖然我的個人專案流量沒有大到會讓我覺得 S3 很貴,但是人因夢想而偉大,我始終幻想著有朝一日自己的網站會有百萬人瀏覽 🤣。

在 Laravel 中使用 R2

Laravel 沒有並內建 Cloudflare R2 驅動程式,不過 R2 的 API 與 S3 API 是完全相容的,因此我們可以使用 Laravel 的 S3 驅動程式來存取 R2 儲存空間。

首先安裝 Flysystem 的 S3 套件:

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

接著在 config/filesystems.php 中加入 R2 的連線設定:

return [
    // ...
    'r2' => [
        'driver' => 's3',
        'key' => env('R2_ACCESS_KEY_ID'),
        'secret' => env('R2_SECRET_ACCESS_KEY'),
        'region' => 'auto',
        'bucket' => env('R2_BUCKET'),
        'url' => env('R2_URL'),
        'endpoint' => env('R2_ENDPOINT'),
        'use_path_style_endpoint' => env('R2_USE_PATH_STYLE_ENDPOINT', false),
        'throw' => false,
        'report' => false,
    ],
];

R2 沒有傳統意義上的 region,但設定上還是需要一個非空值,所以我這裡隨便設定了一個 auto。

接著就可以到 Cloudflare 的 Account API tokens 頁面中,建立要給 Laravel 應用的 API Token,權限設定 Workers R2 Storage 的 Edit 權限。

建立後,我們就可以將相關設定寫入 .env 檔案:

R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_ENDPOINT=
R2_URL=
R2_BUCKET=

其中,R2_ENDPOINT 通常是 https://<帳號 ID>.r2.cloudflarestorage.com;R2_URL 則應填寫用來存取物件的公開網址,例如自訂的 CDN 網域。

完成設定後,就可以在 Laravel 中上傳檔案到 R2了:

Storage::disk('r2')->put('file.txt', 'Hello, World!');

參考資料

Allen
written by
Allen

持續努力中的後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

則留言
訪客

API 直接相容真是太讚了!(搶客戶?)

顯示更多留言
新增留言
訪客 2026 年 10 月 22 日