Laravel の Storage で S3 の特定のディレクトリをプレフィックスとして固定したい
LaravelにはStorage というファサードがあり、ローカルだろうがS3だろうが簡単ファイル操作を簡単に行うことができ、とても便利です。
config/filesystems.php
のdisksにはデフォルトで以下のような設定があります。
'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL') . '/storage', 'visibility' => 'public', ], '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'), ], ],
.env
にAWSの設定をして、アクセス制限がしっかりしていれば、
Storage::disk('s3')->putFile('photos', new File('/path/to/photo'));
とするだけで、 S3上のAWS_BUCKET
バケットのphotos
ディレクトリに/path/to/photo
のファイルがアップロードされます。
簡単で便利ですが、そのプロジェクトで使うディレクトリがphotos
限定であったとき、毎回指定するのが面倒です。
public
の場合はroot
というオプションで設定できるようですが、s3
の場合にどうすれば良いのかわかりませんでした。
調べても情報はあんまり無かったのですが、山勘でやった結果うまく設定できました。
public
と同じようにroot
を設定するだけです。
'photos_s3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'root' => 'photos', 'url' => env('AWS_URL'), ],
これで、
Storage::disk('photos_s3')->putFile('', new File('/path/to/photo'));
とするだけで、先程と同じことが実現できます。