これをしたくて検索しても、たいていアップロードしてS3に保存する的な利用方法での実装が多く、
- すでに存在するファイルを保存したい
- 名前はそのまま
- 公開権限をつけたい
という前提だとなかなか情報にたどり着かずでした。
そのため、いろいろ試行錯誤したところ下記のようにシンプルなコードで実装することができました(Laravel5.5です)。
Laravel
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\File;
$disk = Storage::disk('s3');
$disk->putFileAs($savePath, New File($filePath), $fileName, ['ACL' => 'public-read']);
$savePath
: S3上のパス ※最初と最後の / は省く
$filePath
: ローカル上のファイルのフルパス(ファイル名含む)
$fileName
: S3に保存するときのファイル名
ちなみに、Illuminate\Http\File
を use せず、…, New File($filePath),…
を …, New \File($filePath),…
とすると、Illuminate\Support\Facades\File
が読み込まれてしまいエラーになる場合があるのでご注意を。
追記
上記はLaravel8では動作しませんでした。本バージョンでは下記になります。
Laravel
$disk = Storage::disk('s3');
$disk->putFileAs($savePath, $filePath, $fileName, ['ACL' => 'public-read']);