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();
变量转储 $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
}
}
图片class
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);
}
您的其中一张图片可能未设置。因此,当您使用 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
}
查看原始循环
$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
}
您似乎正在处理包含多个文件上传的请求。您用于 post 到此 Laravel 路由的表单、javascript 代码或 flash 上传程序代码看起来像是在发送至少一个文件(或者可能是一个空白文件条目)Laravel的请求对象无法处理成对象。像这样的循环可能会揭示更多关于正在发生的事情
foreach($images as $image)
{
var_dump($image);
}
其中大部分将是 Symfony\Component\HttpFoundation\File\UploadedFile
个对象,但我敢打赌其中至少有一个是 null
。您也可以尝试 var_dump($_FILES)
并查找任何明显的错误或空条目 - 可能对于服务器来说太大而无法处理?
你不能使用 lukasgeiter's solution is the Symfony\Component\HttpFoundation\File\UploadedFile
class has PHP's internal SplFileInfo
class as an ancsetor, and until very recently PHP 的原因有一个 bug/feature 程序员无法将 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;
}
因此,如果您是源代码调试人员,请从这里开始。
我在堆栈上搜索,发现很多这样的问题...
但是,我确信我正在使用一个对象并且已经在转储中验证了它。
错误
>16: Call to a member function getRealPath() on a non-object
第 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
}
}
图片class
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);
}
您的其中一张图片可能未设置。因此,当您使用 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
}
查看原始循环
$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
}
您似乎正在处理包含多个文件上传的请求。您用于 post 到此 Laravel 路由的表单、javascript 代码或 flash 上传程序代码看起来像是在发送至少一个文件(或者可能是一个空白文件条目)Laravel的请求对象无法处理成对象。像这样的循环可能会揭示更多关于正在发生的事情
foreach($images as $image)
{
var_dump($image);
}
其中大部分将是 Symfony\Component\HttpFoundation\File\UploadedFile
个对象,但我敢打赌其中至少有一个是 null
。您也可以尝试 var_dump($_FILES)
并查找任何明显的错误或空条目 - 可能对于服务器来说太大而无法处理?
你不能使用 lukasgeiter's solution is the Symfony\Component\HttpFoundation\File\UploadedFile
class has PHP's internal SplFileInfo
class as an ancsetor, and until very recently PHP 的原因有一个 bug/feature 程序员无法将 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;
}
因此,如果您是源代码调试人员,请从这里开始。