input type="file"未選択時は…
例
<input type="file" name="hoge_imagefile">
上記で画像ファイルを選択しなかった場合は、PHP側で既存の画像をS3に保存しようとしました。
ですのでPHP側の該当箇所記述は下記かなと思って…
// リクエストに画像が存在しない場合
if(is_null($request->hoge_imagefile))
{
$request->hoge_imagefile = $fuga->image;
}
// S3、DBへの保存アクションが以降で実装される
つまり、リクエスト画像が存在しない場合はすでに保存されている画像のパスをそのまま使用する、という形になっています。
(実装方法があまりよろしくないとは思いますが、本記事の趣旨とは異なるので無視)
いずれにせよリクエストが無くても従来画像が保存されると思ったのですが、思い込みとは恐ろしいもので…
どうなったのか?
// $image_pathは上記の$request->hoge_imagefile
// S3へのアップロードメソッド
private function uploadImage(string $image_path)
{
$path = Storage::disk('s3')->putFile('s3folder', $image_path, 'public');
$url = Storage::disk('s3')->url($path);
return $url;
}
上記の$path = Storage::disk('s3')->putFile('s3folder', $image_path, 'public');
の部分でLaravelから「$image_pathが無いぞ」って怒られます…
「なんでや!is_null()使ったやろ!」悩むこと1時間…
原因
公式ドキュメントを読みましょう。エラーの内容を読みましょう。
まずエラーですが、The file 〜 does not existです。(中学生でもわかる簡単英語ですね)
要するに該当のファイルが無いのです。肝心なのはnullどうのこうのより、ファイルが存在しないのです。
次にMSDNを眺めてみると…ありました!
https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/file
なになに…
ファイルが選択されていない場合は、値は空文字列 ("") になります。
空文字列("")になります(nullではない、そうnullではないのです…)
結論
とにかく公式ドキュメントとエラー内容を確認!!!
おまけ
…C#のIsNullOrEmpty()がPHPにもありませんか?…そう、無いですか…おっ!
偉大な先人がいますね!