質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Q&A

解決済

1回答

2213閲覧

UploadedFile、画像ファイルアップロードでnullが指定されてしまう

iwatadaigo

総合スコア5

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

0グッド

0クリップ

投稿2021/04/16 08:24

編集2021/04/16 12:31

画像ファイルをアップロードしたいです。

Laravel7にてフリマアプリ作成中です。
商品の画像をアップロードしたいのですが、以下のようなエラーが発生しました。
saveImage()メソッドでnullが指定されてコントローラーで呼び出されてしまっている(?)のかと思いますが、なぜnullになるのかわかりません。

発生している問題・エラーメッセージ

Argument 1 passed to App\Http\Controllers\SellController::saveImage() must be an instance of Illuminate\Http\UploadedFile, null given, called in /work/backend/app/Http/Controllers/SellController.php on line 40

該当のソースコード

public function store(SellRequest $request, Item $item) { $user = Auth::user(); $imageName = $this->saveImage($request->file('item-image')); $item->image_file_name = $imageName; ~略 $item->save(); return redirect()->back() ->with('status', '商品情報を変更しました。'); }
private function saveImage(UploadedFile $file): string { $tempPath = $this->makeTempPath(); Image::make($file)->fit(250, 150)->save($tempPath); $filePath = Storage::disk('public') ->putFile('item-images', new File($tempPath)); return basename($filePath); }
<form method="POST" action="{{ route('sell') }}" class="p-2" enctype="multipart/form-data"> @csrf {{-- 商品画像 --}} <div>商品画像</div> <div class="d-none d-md-block"> <span class="item-image-form image-picker"> <input type="file" name="item-image" class="d-none" accept="image/png,image/jpeg,image/gif" id="item-image" /> <label for="item-image" class="d-inline-block" role="button"> <img src="/images/item-image-default.png" style="object-fit: cover; width: 300px; height: 300px;"> </label> </span> </div> <div class="d-md-none"> <span class="item-image-form image-picker"> <input type="file" name="item-image" class="d-none" accept="image/png,image/jpeg,image/gif" id="item-image" /> <label for="item-image" class="d-inline-block" role="button"> <img src="/images/item-image-default.png" style="object-fit: cover; width: 100%; height: 20%;"> </label> </span> </div> <div class="form-group mb-0 mt-3 w-50 offset-3"> <button type="submit" class="btn btn-block btn-primary"> 出品する </button> </div> </from>
Route::post('sell', 'SellController@store')->name('sell');

SellRequest

1public function rules() 2 { 3 return [ 4 'item-image' => ['file', 'image'], 5 'name' => ['required', 'string', 'max:255'], 6 'description' => ['required', 'string', 'max:2000'], 7 'category' => ['required', 'integer'], 8 'condition' => ['required', 'integer'], 9 'price' => ['required', 'integer', 'min:100', 'max:9999999'], 10 ]; 11 }

補足情報(FW/ツールのバージョンなど)

laravel7

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lulucom

2021/04/16 08:29 編集

</form> が </from> になってしまっていますが、そこは関係無さそうですか? あと、送信ボタンも無い気がするのですが・・・
iwatadaigo

2021/04/16 08:31

それはこちらでの記述ミスですね、実際のコードでは間違ってないです。 送信ボタンも省略してます、必要でしょうか?
Lulucom

2021/04/16 08:31

掲載するコードも違う気がします。 ルートのアクションが 'SellController@store' になっていますので、updateメソッドではなく、storeメソッドのコードを掲載すべきではないでしょうか。
Lulucom

2021/04/16 08:34

> 送信ボタンも省略してます、必要でしょうか? 載せた方が良いと思います。もしかしたらJSからsubmitしているのかな、そのJSのsubmit方法がまずいのではないかな、と考えてしまう可能性があるからです。
iwatadaigo

2021/04/16 08:37

掲載するコードはメソッド名の記述ミスでした。 送信ボタンも掲載しました。
Lulucom

2021/04/16 08:39

ありがとうございます。SellRequest のコードも掲載されると良いかなと思います。
iwatadaigo

2021/04/16 08:41

SellRequest掲載しました
Lulucom

2021/04/16 08:44 編集

ありがとうございます。 ファイル未指定で「出品する」ボタンを押すとそのエラーになってしまいそうですが、 ファイル指定時でもそのエラーになってしまう、ということでしょうか。
iwatadaigo

2021/04/16 08:44

はい、そうです。
Lulucom

2021/04/16 08:51

ファイルサイズが大きすぎてアップロードに失敗しているということはないでしょうか。 サイズが小さいファイルで試しても同じでしょうか。
iwatadaigo

2021/04/16 08:55

3KBのファイルでも同じでした。
Lulucom

2021/04/16 09:04 編集

デバッグのため、storeメソッドの最初で以下のような感じのコードを書くと、何かエラー等は出力されますか? dd($request->file('item-image')->getErrorMessage()); // debug ↑すみません、nullなのでこれだとダメですね・・・うーん
Lulucom

2021/04/16 11:09

store メソッドの最初で以下のようなコードを書いてみた場合、true と表示されますか? dd($request->hasFile('item-image')); // debug
Lulucom

2021/04/16 11:12 編集

! ということはフォーム側に何か問題があるのかもしれませんね。
Lulucom

2021/04/16 11:19 編集

掲載されたBladeのコードではformは1つしかありませんが、実際には他にもformがあって、別のformから送信されているとか、formがネストしてしまっている(2重構造になってしまっている)、あるいは、別のBladeのformから送信されている、ということはないでしょうか。
iwatadaigo

2021/04/16 12:10

このBladeにはformは一つだけです。 別のBladeから送信されているなんてことがありえるんですか?
Lulucom

2021/04/16 12:21

そうですか・・・いえ、それなら良いのですが、勘違い等で違うコードを見ていたという可能性もゼロでは無いと思いましたので念のための確認でした。個人的な経験で、formがネストしてしまっていて違うformから送信されていたのが原因だったり、まったく別のページのformを確認していたというケースがありましたので。 Bladeのコードよりも、表示されたページのHTMLソースから、そのformとinputがどうなっているかを確認されたほうが良いかもしれませんね。
iwatadaigo

2021/04/16 12:29

解決いたしました。 やはり原因はbladeの中身で、ここで解決できなかったのはbladeの中身を省略してしまったからです。 貴重なお時間を奪ってしまって誠に申し訳ありません。
Lulucom

2021/04/16 12:31

いえいえ、解決されたようで良かったです。 ご自身で詳しい回答を書かれてBAにしていただければと思います。
iwatadaigo

2021/04/16 12:37

ありがとうございました!
guest

回答1

0

自己解決

bladeにて、レスポンシブを意識してアップロードする場所を2つ用意して、画面幅によって表示するHTMLを変えていました。
その結果、ファイルアップロード時に不具合が起きていたものと思われます。

投稿2021/04/16 12:34

iwatadaigo

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問