5

当我在 laravel 中处理表单时,我的表单中有一个文件上传字段(附件 1),其中可能有也可能没有文件上传。

当我尝试处理页面时,此行会生成异常:

Input::upload('attachment1',path('storage').'attachments/'.$name);

这是异常的文本:

Message:
Call to a member function move() on a non-object

看来我需要提前检查是否'attachment1'有文件,我发现该函数Input::has_file('attachment1')应该告诉我是否'attachment1'有文件,但即使我提交一个空表单,它也会返回true。

此外,从阅读文档来看,似乎Input::upload应该在尝试上传不存在的文件时返回 false,那么为什么它会产生这个异常,我该如何解决呢?

4

4 回答 4

4

在尝试上传附件之前,您应该尝试进行一些检查。这对我有用:

$file = Input::file('attachment1');
 if (is_array($file) && isset($file['error']) && $file['error'] == 0) {
 Input::upload('attachment1',path('storage').'attachments/'.$name);
}
于 2012-12-29T10:31:29.060 回答
3

无论文件是否上传,PHP$_FILES都将在其中包含密钥。tmp_name它是作为空字符串发送的,而不是NULL. 看来has_file()期望NULL

public static function has_file($key)
{
    return ! is_null(static::file("{$key}.tmp_name"));
}

要在您的控制器中解决它,您可以尝试:

if (array_get(Input::file('attachment1'), 'tmp_name'))
{
    // file uploaded
}
于 2012-06-21T20:46:51.947 回答
0

在试图弄清楚 Laravel 如何处理 uplaod 和文件时,我学到了一些要点。我希望他们对你有帮助

第一的:

“消息:在非对象上调用成员函数 move()”

可能会抛出此异常,因为您的文件夹可能没有写入权限。

第二:

您可以在验证规则中验证您的输入,例如

'附件' => '图像|mime:jpg,gif,png|max:(以千字节为单位)

第三:

我在我的项目中使用扩展的引导程序。他们不喜欢使用“名称”属性。和

<input type="file" />

您可以从此链接查看。请向下滚动到选项部分并阅读名称的描述列。因此我基本上明白了,即使输入为空,Laravel 也会返回 true,因为它实际上是帖子的一部分

第四:我想分享我的代码并接受任何建议。我希望他们都能帮助...

try
    {

        $comp = new Company();
        $comp->name = newCompanyForm::get('name');
        $comp->save();
        if($comp)
        {
                if(newCompanyForm::has('logo'))
                {

                    $logo = Input::upload('logo', path('public').'company_logos');
                    if($logo)
                    {

                        $comp->logo = URL::base().'lms/company_logos/'.$logo->getfileName();
                        $comp->save();
                    }
                    else
                        throw new \Exception("Logo yüklenirken hata oluştu. Şirket logosuz kayıt edildi.");
                }
                Session::flash('status_success', 'Şirket eklendi.');
                newCompanyForm::forget_input();
                return Redirect::back();
        }
        else
            throw new Exception("Şirket eklenirken hata oluştu. Şirket eklenmedi.");

    }
    catch(\Exception $e)
    {
        $errors->add('lms', $e->getMessage());
        return Redirect::back()->with_errors($errors);
    }
于 2012-12-20T03:48:08.717 回答
0

最简单的“Laravel”方法是检查输入名称。

if (Input::has('attachment1'))
{
    // Do stuff
}
于 2013-12-07T19:25:18.773 回答