Laravel $request - >file () возвращает значение null

возникли проблемы при попытке загрузить файлы с помощью Laravel на задней панели.

вопрос

что Laravel $request->file() метод возвращает значение null.

настройка

Я создаю запрос AJAX, используя суперагент, отладил запрос, и все кажется прекрасным. The Content-Length изменения в зависимости от изображения, которое я добавляю, указывая, что изображение было добавлено в запрос. The Content-Type также multipart/form-data.

// request headers
Content-Length:978599
Content-Type:multipart/form-data; 

// request payload
Content-Disposition: form-data; name="files"; filename="item-keymoment.png"
Content-Type: image/png

но я не удалось получить файл в Laravel. Используя $request->file('files') возвращает NULL, но если я отлажу $_FILES массив, я заметил, что мой файл был загружен.

dd($request->file('files'))
// NULL

dd($_FILES);
// array:1 [
//   "files" => array:5 [
//     "name" => "item-keymoment.png"
//     "type" => "image/png"
//     "tmp_name" => "/tmp/phpipbeeM"
//     "error" => 0
//     "size" => 978274
//   ]
// ]

dd($request->files->all())
// []

что может заставить Laravel игнорировать файл?
Content-Type входного файла не application/octet-stream?

ниже ответили на вопрос.

2 ответов


вы должны добавить в тег формы 'enctype=" multipart / form-data'

например:

<form method="POST" action="{{route('back.post.new')}}" enctype="multipart/form-data">
......
</form>

добавление вы можете использовать свой пользовательский запрос.

Я надеюсь, это может вам помочь!


заметил, что $request объект, который я получал в методе контроллера, был экземпляром JsonRequest, который является пользовательским классом (пуст), что расширяет Illuminate\Http\Request.

и он реализован как:

<?php

namespace App\Http\Requests;

use Illuminate\Http\Request;

class JsonRequest extends Request {
}

но если я изменю:

// from
use App\Http\Requests\JsonRequest;
public function add_background_image (JsonRequest $request) {
  dd($request->file('files'))
  // NULL
}

// to
use Illuminate\Http\Request;
public function add_background_image (Request $request) {
  dd($request->file('files'))
  // UploadedFile {#266
  //   -test: false
  //   -originalName: "item-keymoment.png"
  //   -mimeType: "image/png"
  //   -size: 978274
  //   -error: 0
  //   ...
  // }
}

Я получаю желаемый входной файл. На данный момент переключение экземпляра $request решает мой вопрос

но я не понимаю, почему/как расширение Illuminate\Http\Request пустой класс ломает вещи.
может кто-нибудь объяснить?

мое намерение с подклассами Illuminate\Http\Request было присоединить методы $requests для работы с исключениями/ошибками унифицированным способом для запросов API. Например, когда в развертывании отображаются сообщения об исключениях, но в производстве возвращается фиксированное сообщение.
есть ли другой/лучший / более Laravel способ сделать это?
Я думаю, просто создам JsonController вместо расширения Запрос.