Загрузчик нескольких файлов в Laravel 6: должен быть экземпляром Symfony \ Component \ HttpFoundation \ File \ UploadedFile, заданным массивом

Что у меня есть

Я создал очень простой загрузчик нескольких изображений в Laravel 6. Код представления и контроллера следующий:

Просмотр:

<form action="{{ route('create') }}" method="POST" enctype="multipart/form-data">
    @csrf
    <input name="images[]" type="file" multiple="multiple" />
</form>

Контроллер:

function create(Request $request) {
    $this->validate($request, [
        'images.*' => 'image',
    ]);

    foreach($request->images as $image) {
        // $filename = 'IMG_1921.jpg'
        $filename = $image->getClientOriginalName();

        // $path = 'uploads/IMG_1921.jpg'
        $path = $image->storeAs('uploads', $filename);

        // $absolutePath = 'C:\htdocs\laravel-test\storage/uploads/IMG_1921.jpg'
        $absolutePath = sprintf('%s/%s', storage_path(), $path);

        // crash here
        // $data = getimagesize($absolutePath); 
    }

    return 'ok';
}

Эта проблема

Все работает нормально, пока я не раскомментирую строку функции getimagesize($absolutePath). Я также пробовал с filesize($absolutePath), и выдается такая же ошибка:

Аргумент 1, переданный в Facade \ FlareClient \ Context \ RequestContext :: Facade \ FlareClient \ Context {closure} (), должен быть экземпляром Symfony \ Component \ HttpFoundation \ File \ UploadedFile, заданным массивом

Я не понимаю, почему отображается эта ошибка, если getimagesize() не использует какой-либо объект UploadedFile.

Подробнее об ошибке:

введите здесь описание изображения


person cespon    schedule 10.09.2019    source источник
comment
попробуйте dd($absolutePath) и прокомментируйте результат   -  person rkg    schedule 10.09.2019
comment
dd($absolutePath) возвращает "C:\htdocs\laravel-test\storage/uploads/IMG_1921.jpg". gettype($absolutePath) возвращает string.   -  person cespon    schedule 10.09.2019


Ответы (2)


Я обнаружил проблему: в абсолютном пути отсутствует папка app. Это должно быть C:\htdocs\laravel-test\storage/app/uploads/IMG_1921.jpg вместо C:\htdocs\laravel-test\storage/uploads/IMG_1921.jpg.

Итак, решение - добавить сюда /app:

$absolutePath = sprintf('%s/app/%s', storage_path(), $path);
person cespon    schedule 10.09.2019

Попробуйте сделать это внутри цикла foreach:

$data = getimagesize($image->photo->path());
person rkg    schedule 10.09.2019