概要
- EC2に設置したLaravelアプリケーションの内部処理でファイルをS3に設置する処理でfalseが帰ってくる問題の解決方法をメモ的にまとめる。
原因
- S3にアップロードするオブジェクト(ファイル) のポリシーをLaravel側で明示的にpublicに指定していたため。
- 当該のS3バケットは「オブジェクト所有者」を「ACL無効(推奨)」に設定していたため、アップロードされるオブジェクト(ファイル)個々に権限を指定する事はできず、エラーが発生したっぽい。
問題までの経緯
-
EC2のApache上で動作しているLaravelアプリケーションにおいて、formからファイルをPost → 受け取ってS3格納する処理を作成した。
-
受け取ったファイルをS3にアップロードする処理は下記の様に記載した。(
$file
は任意のバリデーションを通過したFormRequestクラスを継承したリクエストオブジェクトそのまま)Storage::putFile(ファイル設置するディレクトリのパス, $file, 'public');
問題
- 上記に記載したputFile処理でfalseが返される(正常にファイルアップロードされている場合、設置先のパスが返される。)
問題解決までの経緯
-
アップロード処理を下記のように変更した。
Storage::putFile(ファイル設置するディレクトリのパス, $file);
-
正常にファイルをアップロードする事ができた。
-
putFile時にどうしても
public
を指定してファイルアップロードしたい場合、アップロード先のバケットの「オブジェクト所有者」の設定を「ACL有効」に設定し「希望するバケット所有者」のラジオボタンを選択すれば大丈夫だと思う。(筆者未検証 -
)