Web

Почему форма с enctype возвращает нулевой файл в запросе

Я попытался отредактировать товары в своем магазине. В запросе отсутствует $request->file('image'); Я прилагаю исходный код ниже. Я действительно не знаю, почему не получаю изображение в запросе, поскольку думаю, что сделал все правильно.

Моя форма:

<form  method="POST" action="{{ route('products.update', $product->id)}}" enctype="multipart/form-data">

        @csrf

        @method('PATCH')

        <div class="row">

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput1">Product slug</label>

                    <input type="text" name="product_slug" value="{{$product->product_slug}}" class="form-control" id="exampleFormControlInput1" placeholder="Enter slug">

                  </div>

            </div>

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput111">Product title</label>

                    <input type="text" name="product_title"  value="{{$product->product_title}}" class="form-control" id="exampleFormControlInput111" placeholder="Enter slug">

                  </div>

            </div>

        </div>

        <div class="row">

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput2">Product category</label>

                    <input type="text" name="product_category"  value="{{$product->product_category}}" class="form-control" id="exampleFormControlInput2" placeholder="name@example.com">

                  </div>

            </div>

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput3">Product brand</label>

                    <input type="text" name="product_brand"  value="{{$product->product_brand}}" class="form-control" id="exampleFormControlInput3" placeholder="name@example.com">

                </div>

            </div>

        </div>

        <div class="row">

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput22">Product display</label>

                    <input type="text" name="product_display"  value="{{$product->product_display}}" class="form-control" id="exampleFormControlInput22" placeholder="name@example.com">

                  </div>

            </div>

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput34">Product ram</label>

                    <input type="text" name="product_ram"  value="{{$product->product_ram}}" class="form-control" id="exampleFormControlInput34" placeholder="name@example.com">

                  </div>

            </div>

        </div>

        <div class="row">

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput33">Product os</label>

                    <input type="text" name="product_os"  value="{{$product->product_os}}" class="form-control" id="exampleFormControlInput33" placeholder="name@example.com">

                  </div>

            </div>

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput333">Product camera</label>

                    <input type="text" name="product_camera"  value="{{$product->product_camera}}" class="form-control" id="exampleFormControlInput333" placeholder="name@example.com">

                  </div>

            </div>

        </div>

        <div class="row">

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlInput8">Product price</label>

                    <input type="text" name="product_price"  value="{{$product->product_price}}" class="form-control" id="exampleFormControlInput8" placeholder="name@example.com">

                  </div>

            </div>

            <div class="col">

                <div class="form-group">

                    <label for="exampleFormControlFile1">Change product photo</label>

                    <input type="file" name="image" value="{{$product->product_image}}" class="form-control-file" id="exampleFormControlFile1">

                    <img src="/storage/img/tech/{{$product->product_image}}" style="width:300px" alt="product_image">

                  </div>

            </div>

        </div>

 


 

        <div class="form-group">

          <label for="short_description">Short description</label>

          <textarea class="form-control" name="about_product" id="short_description" rows="10">{{$product->about_product}}</textarea>

        </div>

        <div class="form-group">

            <label for="long_description">Long description</label>

            <textarea class="form-control" name="product_description"   id="long_description" rows="10">{{$product->product_description}}</textarea>

          </div>

          <input type="submit" value="Edit" class="btn btn-success" name="submit">

          <a href="/admin/products" class="btn btn-primary">Go back</a>

      </form>

 

Если я удалю часть с изображением, код будет полностью функциональным. Моя функция в controller(type resource)

public function update(Request $request, $id) {

        dd($request->all());

        $request->validate([

            'product_slug' => 'required|max:100',

            'product_title' => 'required|max:100',

            'product_category' => 'required|max:100',

            'product_brand' => 'required|max:100',

            'product_image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048',

            'product_display' => 'required',

            'product_camera' => 'required',

            'product_ram' => 'required',

            'product_os' => 'required',

            'product_price' => 'required|max:100',

            'about_product' => 'required',

            'product_description' => 'required'

        ]);

            $input = $request->all();

        if ($image = $request->file('image')) {

                $destinationPath = 'storage/img/tech/';

                $profileImage = $image->getClientOriginalName();

                $image->move($destinationPath, $profileImage);

                $input['image'] = $profileImage;

        } else {

            unset($input['image']);

        }

        $product = Product::find($id);

        $product->product_slug = $request->get('product_slug');

        $product->product_title = $request->get('product_title');

        $product->product_category = $request->get('product_category');

        $product->product_brand = $request->get('product_brand');

        $product->product_display = $request->get('product_display');

        $product->product_ram = $request->get('product_ram');

        $product->product_camera = $request->get('product_camera');

        $product->product_os = $request->get('product_os');

        $product->product_price = $request->get('product_price');

        $product->product_image = $profileImage;

        $product->about_product = $request->get('about_product');

        $product->product_description = $request->get('product_description');

        $product->update();

        return redirect('/admin/products')->with('success', "product updated!");

    }

 

Ответ 1

Основная проблема здесь в том, что value="{{ $product-> product_image }}" -  неверно. <input type="file"> не поддерживает это, так как изображение должно быть загружено напрямую с компьютера пользователя, и если файл не выбран или не загружен, $request->file('image') вернет null.

Чтобы справиться с этой проблемой, используйте некоторую условную логику в контроллере:

Сначала загрузите изображение и установите ссылку на файл:

$profileImage = null;

if ($image = $request->file('image')) {

  $destinationPath = 'storage/img/tech/';

  $profileImage = $image->getClientOriginalName();

  $image->move($destinationPath, $profileImage);

}

 

Затем установите в $product->product_image в значение $profileImage:

$product = Product::find($id);

...

if ($profileImage)

  $product->product_image = $profileImage;

}

 

Используйте тернарный или null-coalesce оператор:

$product->product_image = $profileImage ? $profileImage : $product->product_image;

// или

$product->product_image = $profileImage ?? $product->product_image;

 

В обоих случаях будет установлено $product->product_image в значение $profileImage или существующее значение, $product->profile_image, если ничего не указано (это будет существующее изображение или null).

Схожие статьи

Как бесплатно проверить доступность сайта из разных частей мира?
Web

Как бесплатно проверить доступность сайта из разных частей мира?

Web

Как удалить куки

Web

isset() и empty() - что лучше использовать?

Web

Как создать сервер веб-сокетов на PHP

×