1

我创建了一个存储库来使用Intervention/Image库管理上传图像,但是当我尝试保存图像时,我得到了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);
}

当我提交表格时,我得到:

Image.php 第 119 行中的 FatalErrorException:在 HandleExceptions.php 中的 FatalErrorException->__construct() 中的 Image.php 第 119 行中的 null 上调用成员函数 encode() 在 HandleExceptions.php 第 118 行中的 HandleExceptions->fatalExceptionFromError() 中的第 133 行在 HandleExceptions->handleShutdown() 在 HandleExceptions.php 第 0 行在 Image->encode() 在 Image.php 第 139 行在 Image->save() 在 InterventionImageRepository.php 第 96 行在 InterventionImageRepository->save() 在 PlacesController.php在 Controller.php 第 76 行中 PlacesController->store() 的第 80 行

问题应该在这里:at Image->save() in InterventionImageRepository.php line 96

并且该行在具体类中,在 save 方法中:

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

有人可以帮我找到问题吗?

4

1 回答 1

0

根据错误:

在 null 上调用成员函数 encode() ...

这意味着您正在尝试在未收到图像时保存图像 - null

问题在于saveInterventionImageRepository班级中的功能。我已经对其进行了修改以检查是否有图像。

还要考虑您的图像文件名有错字(immagine)。确保在 type=file 的表单输入字段中使用相同的单词。否则将其更正为在controller/classfiles 和 frond end中具有相同的名称views。还要确保在<form>标签中使用 enctype="multipart/form-data"。 <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

于 2016-05-28T09:02:59.523 回答