Laravel 调用非对象上的成员函数


Laravel Call to a member function on a non-object

我在堆栈上搜索了很多这样的问题......

但是,我

确定我正在使用一个对象,并且已经在转储中验证了这一点。

错误

>16: Call to a member function getRealPath() on a non-object

16号线

$image->getRealPath();

Var Dump $image

object(Symfony'Component'HttpFoundation'File'UploadedFile)#9 (7) { ["test":"Symfony'Component'HttpFoundation'File'UploadedFile":private]=> bool(false) ["originalName":"Symfony'Component'HttpFoundation'File'UploadedFile":private]=> string(41) "5a862f92da957da3e0208357ce006afd_970x.jpg" ["mimeType":"Symfony'Component'HttpFoundation'File'UploadedFile":private]=> string(10) "image/jpeg" ["size":"Symfony'Component'HttpFoundation'File'UploadedFile":private]=> int(346047) ["error":"Symfony'Component'HttpFoundation'File'UploadedFile":private]=> int(0) ["pathName":"SplFileInfo":private]=> string(24) "C:'xampp'tmp'phpA5C7.tmp" ["fileName":"SplFileInfo":private]=> string(11) "phpA5C7.tmp" } 

如果我倾倒$image->getRealPath();我会得到一个string(24) "C:'xampp'tmp'phpE193.tmp"这就是我想要的。 我不知道为什么它说$image显然不是一个对象。

控制器

# Process Images - Queue?
if ($filesUploaded) {
    $images = Input::file('images');
    foreach ($images as $image) {
        # Record Creation
        $record = new Image;
        $record->user_id = Auth::id();
        $record->ad_id = $adId;
        $record->name = Str::random();
        $record->save();
        # Create TN
        $record->createTN($image);
        # Create Smalls
        # Create Larges
    }
}

图像类

public function createTN($image) {
    $PUBLIC_PATH = public_path();
# Load Zebra Image Library
require_once $PUBLIC_PATH.'/uploads/Zebra_Image.php';
$destinationPath = $PUBLIC_PATH.'/uploads/thumbnails/';
$tn = new Zebra_Image();
$tn->source_path = $image->getRealPath();
$tn->target_path = $destinationPath.$this->name.'_sm.jpg';
$tn->jpeg_quality = 60;
$tn->preserve_aspect_ratio = true;
$tn->enlarge_smaller_images = true;
$tn->resize(100, 100, ZEBRA_IMAGE_CROP_CENTER);
}

查看原始循环

$images = Input::file('images');
foreach ($images as $image) {
    # Record Creation
    $record = new Image;
    $record->user_id = Auth::id();
    $record->ad_id = $adId;
    $record->name = Str::random();
    $record->save();
    # Create TN
    $record->createTN($image);
    # Create Smalls
    # Create Larges
}

您似乎正在处理包含多个文件上传的请求。 您用于发布到此Laravel路由的表单,javascript代码或flash上传器代码看起来就像它正在发送至少一个Laravel的请求对象无法处理到对象的文件(或者可能是空白文件条目)。 像这样的循环可能会揭示更多关于正在发生的事情的信息

foreach($images as $image)
{
    var_dump($image);
}

其中大多数将是Symfony'Component'HttpFoundation'File'UploadedFile对象,但我敢打赌其中至少有一个是null . 您也可以尝试var_dump($_FILES)并查找任何明显的错误或空条目 - 也许对于服务器来说太大而无法处理?

你不能使用 lukasgeiter 的解决方案的原因是Symfony'Component'HttpFoundation'File'UploadedFile类将 PHP 的内部SplFileInfo类作为 ancsetor,直到最近 PHP 还有一个错误/功能,程序员不能将SplFileInfo转换为布尔值(使用 using !将变量转换为布尔类型进行比较)

最后,Laravel依靠Symfony组件来实现其文件上传功能。 我相信你可以在这里找到Symfony'Component'HttpFoundation'File'UploadedFile实例化

#File: vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/FileBag.php
protected function convertFileInformation($file)
{
    if ($file instanceof UploadedFile) {
        return $file;
    }
    $file = $this->fixPhpFilesArray($file);
    if (is_array($file)) {
        $keys = array_keys($file);
        sort($keys);
        if ($keys == self::$fileKeys) {
            if (UPLOAD_ERR_NO_FILE == $file['error']) {
                $file = null;
            } else {
                $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['size'], $file['error']);
            }
        } else {
            $file = array_map(array($this, 'convertFileInformation'), $file);
        }
    }
    return $file;
}

因此,如果您是源头调试人员,请从这里开始。

您的某个图像可能未设置。因此,当您用var_dump检查(第一个)时,一切似乎都很好。但是当完整循环运行时,它会在第二个、第三个、...迭 代。

这应该可以解决它:

foreach ($images as $image) {
    if(!is_object($image)) continue;
    # Record Creation
    $record = new Image;
    $record->user_id = Auth::id();
    $record->ad_id = $adId;
    $record->name = Str::random();
    $record->save();
    # Create TN
    $record->createTN($image);
    # Create Smalls
    # Create Larges
}