2015-12-26 5 views
0

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

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

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 in Image.php line 119: Call to a member function encode() on null in Image.php line 119 at FatalErrorException->__construct() in HandleExceptions.php line 133 at HandleExceptions->fatalExceptionFromError() in HandleExceptions.php line 118 at HandleExceptions->handleShutdown() in HandleExceptions.php line 0 at Image->encode() in Image.php line 139 at Image->save() in InterventionImageRepository.php line 96 at InterventionImageRepository->save() in PlacesController.php line 80 at PlacesController->store() in Controller.php line 76

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

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

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

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

+0

я внедрившие вмешательства изображения с Laravel. Просто дайте мне знать, какую версию laravel вы используете. –

+0

версия 5.2. * –

+0

Когда вы запускаете репозиторий, вы предоставляете фактическое изображение? Я имею в виду, что это в конструкторе. –

ответ

0

По ошибке:

Call to a member function encode() on null ...

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

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

Также обратите внимание на то, что у вашего изображения, имеющего имя, есть опечатка (immagine). Убедитесь, что вы используете одно и то же слово в форме ввода feild с типом = file. Else исправить его, чтобы иметь то же имя как в файлах 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