Laravel 5.2.x – Вмешательство/Изображение – Вызов функции-члена encode() при нулевом значении

Я создал репозиторий для управления загружаемым изображением с помощью Intervention/Imagelibrary, но когда я пытаюсь сохранить изображение, я получаю Call to a member function encode() on null.

Это мой интерфейс:

namespace App\Repositories\MeetMount\ImageUploader;

use Illuminate\Http\Request;

interface ImageContract {
    public function getExt($filename);
    public function setFolder($folderName);
    public function getRandomFilename($fileName);
    public function addWatermark($watermarkName);
    public function resize($width, $height);
    public function getFileName();
    public function save(Request $file);
}

Это мой конкретный класс:

namespace App\Repositories\MeetMount\ImageUploader;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;
use Intervention\Image\Image;

class InterventionImageRepository implements ImageContract {

    /**
     * @var Image
     */
    private $image;

    /**
     * @var $folder
     */
    private $folder;

    /**
     * InterventionImageRepository constructor.
     *
     * @param Image $image
     */
    public function __construct( Image $image )
    {
        $this->image = $image;
    }

    /**
     * Restituisce l'estensione dell'immagine
     *
     * @param $fileName
     * @return string
     */
    public function getExt( $fileName )
    {
        $pos = strrpos( $fileName, '.' );
        $ext = substr( $fileName, $pos, strlen( $fileName ) );

        return $ext;
    }

    /**
     * Imposta la cartella dove salvare l'immagine
     *
     * @param $folderName
     * @return $this
     */
    public function setFolder( $folderName )
    {
        $folderPath = public_path( $folderName );

        if( ! File::exists( $folderPath ) )
        {
            File::makeDirectory( $folderPath );
        }

        $this->folder = $folderPath;

        return $this;
    }

    public function getRandomFilename( $fileName )
    {
        // TODO: Implement getRandomFilename() method.
    }

    /**
     * Aggiungi watermark
     *
     * @param $watermarkName
     * @return $this
     */
    public function addWatermark( $watermarkName )
    {
        $watermarkPath = public_path( 'images/watermarks/' . $watermarkName );
        $this->image->insert( $watermarkPath );

        return $this;
    }

    /**
     * Salva il file
     *
     * @param $file
     * @return $this
     */
    public function save( Request $request )
    {
        $file = $request->file('immagine');

        $fileFolder = $this->folder . '/' . $file->getClientOriginalName();

        $this->image->save( $fileFolder );

        return $this;

    }

    public function getFileName()
    {
        // TODO: Implement getFileName() method.
    }

    public function resize( $width, $height )
    {
        // TODO: Implement resize() method.
    }
}

и это метод магазина:

public function store( CreatePlaceRequest $request )
{
    $this->imageRepository->setFolder('cartella-prova')->save($request);
}

Когда я отправляю форму, я получаю:

FatalErrorException в строке 119 Image.php: вызов функции-члена encode() для null в строке 119 Image.php в FatalErrorException->__construct() в строке 133 HandleExceptions.php в HandleExceptions->fatalExceptionFromError() в строке 118 HandleExceptions.php в HandleExceptions->handleShutdown() в строке HandleExceptions.php 0 в Image->encode() в строке Image.php 139 в Image->save() в строке InterventionImageRepository.php 96 в InterventionImageRepository->save() в PlacesController.php строка 80 в PlacesController->store() в Controller.php строка 76

Проблема должна быть здесь: at Image->save() in InterventionImageRepository.php line 96

и эта строка находится в конкретном классе, в методе сохранения:

$this->image->save( $fileFolder );

Может ли кто-нибудь помочь мне найти проблему?


person Christian Giupponi    schedule 26.12.2015    source источник
comment
Я реализовал изображение вмешательства с помощью laravel. Просто дайте мне знать, какую версию laravel вы используете.   -  person Punit Gajjar    schedule 26.12.2015
comment
версия 5.2.*   -  person Christian Giupponi    schedule 26.12.2015
comment
Когда вы инициируете репозиторий, вы предоставляете фактическое изображение? Так как это в конструкторе, я имею в виду.   -  person Joel Hinz    schedule 26.12.2015
comment
использованное вмешательство/изображение: dev-master, с композитором? ?   -  person Punit Gajjar    schedule 26.12.2015
comment
@PunitGajjar У меня "intervention/image": "^2.3", стоит ли менять? @Joel Нет, в конструкции я просто вставляю библиотеку   -  person Christian Giupponi    schedule 26.12.2015
comment
Я имел ввиду конструктор репозитория. У вас есть это: public function __construct( Image $image ) { $this->image = $image; }. Поэтому, если вы не предоставите изображение при запуске репозитория, $this->image не будет иметь фактического изображения.   -  person Joel Hinz    schedule 26.12.2015
comment
Правильно, я удалил его из конструкции и добавил $image = Image::make($fileFolder); в метод save, но теперь он говорит Call to undefined method Intervention\Image\Image::make()   -  person Christian Giupponi    schedule 26.12.2015
comment
Вы импортируете неправильный класс вверху. Ознакомьтесь с инструкциями по установке здесь image.intervention.io/getting_started/installation. Я бы следовал инструкциям по интеграции Laravel, чтобы получить фасад, но это зависит от вас.   -  person Joel Hinz    schedule 26.12.2015
comment
попробуй с мастером разработки. не переходите на более старую версию.   -  person Punit Gajjar    schedule 26.12.2015


Ответы (1)


По ошибке:

Вызов функции-члена encode() для null...

Это означает, что вы пытаетесь сохранить изображение, пока оно не получено - null.

Проблема с функцией save в вашем классе InterventionImageRepository. Я изменил его, чтобы проверить, есть ли изображение или нет.

Также учтите, что в имени вашего изображения есть опечатка (immagine). Убедитесь, что вы используете одно и то же слово в поле ввода формы с типом = файл. В противном случае исправьте его, чтобы он имел одинаковое имя как в файлах controller/class, так и в конце интерфейса views. Также убедитесь, что вы используете enctype="multipart/form-data" в теге <form>. <form method="post" action="target-path" enctype="multipart/form-data">

В противном случае файлы не будут отправляться на сервер вместе со значениями формы.

/**
 * Salva il file
 *
 * @param $file
 * @return $this
 */
public function save( Request $request )
{
    //first check if the file received
    if($request->hasFile('immagine')){
        $file = $request->file('immagine');
        $fileFolder = $this->folder . '/' . $file->getClientOriginalName();
        $this->image->save( $fileFolder );

        return $this;
    }else{
        //Do some necessary outputs here
        //may be store a message to session and display it to user in the view
        //or return a boolean value and check for it in your store method
    }
}

Обратитесь к этой официальной документации Laravel и улучшите свои скрипты: https://laravel.com/docs/5.2/requests#files

person Janaka R Rajapaksha    schedule 28.05.2016