Laravel调用非对象的成员函数

3

我在 Stack 上搜索了很多类似的问题...

然而,我确定我正在使用一个对象,并已经通过转储进行了验证。

错误

>16: 对非对象调用成员函数getRealPath()

第 16 行

$image->getRealPath();

$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);
}

请问您能否展示一下完整的代码? - lukasgeiter
好的,我已经更新了代码。 - Rafael
如果你在createTN($image)函数内部执行dd($image),你会得到什么? - Tim Lewis
2个回答

3

查看原始循环

$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's 的解决方案的原因是 Symfony\Component\HttpFoundation\File\UploadedFile 类具有 PHP 内部的 SplFileInfo 类作为祖先,并且直到 最近 PHP 存在程序员无法将 SplFileInfo 强制转换为布尔值的 bug/feature(使用 ! 将变量转换为布尔类型进行比较)。 最后,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;
}

如果你是一个喜欢从源头进行调试的人,请从这里开始。


2

你的某个图片可能没有设置。所以当你使用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
}

尝试过了,但是收到了 无法将类Symfony\Component\HttpFoundation\File\UploadedFile的对象转换为布尔值 的错误信息。 - Rafael
2
@Rafael 请尝试使用 if(!is_object($image)) { continue; } 替代。 - Alana Storm
@AlanStorm 谢谢,它没有出现错误。你能否解释一下发生了什么?我真的不知道为什么我的代码不能工作。 - Rafael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,