INFRA

LaravelのLivewireでCloudflare R2にファイルをアップロードする

このStorageの機能を使ってアップロードできます。S3であれば、簡単にアップロードできるようになっています。R2は基本的にS3と互換性がありますので、S3の機能を使ってアップロードすることができます。

File Storage - Laravel 11.x - The PHP Framework For Web Artisans

ライブラリのインストール

まず、下記をインストールしておきます。

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

config/filesystems.phpの修正

最初の状態だとfilesystems.phpは下記があります。

's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
'throw' => false,
],

s3と互換性があるので、上記のまま使ってもよいです。ですので、修正しないで使うことも可能です。 私は、メール送信などで別途AWSを使うケースがありますし、R2を使ってることを忘れる可能性もあるかなあと思ったので、s3を全体的にR2に変更しました。

'r2' => [
'driver' => 's3',
'key' => env('R2_ACCESS_KEY_ID'),
'secret' => env('R2_SECRET_ACCESS_KEY'),
'region' => env('R2_DEFAULT_REGION'),
'bucket' => env('R2_BUCKET'),
'endpoint' => env('R2_ENDPOINT'),
'throw' => true,
],

Cloudflare R2でバケット作成

  • バケットを作成します。
  • 次にR2 APIトークンの管理をクリックして、APIトークンを作成します。
    • アクセスキーIDと、シークレットアクセスキーと、エンドポイントをメモします。
  • 作成したバケットの設定画面にある、「r2.devサブドメイン」に記載されている、「パブリック r2.dev バケットURL」をメモします。

ただ、r2.devサブドメインは本番環境での利用は非推奨です。

r2.dev アクセスを有効にすると、インターネット上の誰でもパブリック r2.dev URL を使用して、このバケット内のオブジェクトを表示できます。ただし、利用にはレート制限があり、本番環境にはお勧めできません。また、Cloudflare の 機能である Access や Cache は利用できなくなります。

.envの設定

R2_ACCESS_KEY_ID={アクセスキーID}
R2_SECRET_ACCESS_KEY={シークレットアクセスキー}
R2_DEFAULT_REGION='apac'
R2_BUCKET={バケット名}
R2_USE_PATH_STYLE_ENDPOINT=false
R2_ENDPOINT={エンドポイント}
R2_PUBLIC_URL={パブリック r2.dev バケットURL}

Livewireでアップロードする

https://livewire.laravel.com/docs/uploadslivewire.laravel.com