在非对象Laravel 4文件上载上调用成员函数move()

时间:2014-07-17 18:59:29

标签: javascript php jquery laravel laravel-4

我在尝试访问internal service 500方法时遇到Call to a member function move() on a non-object错误,原因为Input::file('uploadname');

如果我使用以下代码执行var转储:

echo '<pre>';
var_dump(Input::all());
echo '</pre>';

我得到的结果是该字段中有数据,但是当访问Input::hasFile('uploadname');时,它会给出错误吗?

以下是表单代码:

<div id="div123">
                    <input type="button" value="Upload CV" class="uploadCV">
                </div>
                <div id="uploadbutton">
                    <input type="file" name="upload_cv_company_rep" class="cv" id="upload_cv_company_rep"/>
                </div>

显示按钮,当您单击它时,它会触发input type="file"内容。

它在控制台中显示以下var_dump

console output from var_dump

我控制器中的代码是:

public function uploadUser() {

    if(Input::hasFile('upload_cv_company_rep')) {
        Input::file('upload_cv_company_rep')->move('uploads/');
    } else {
        echo '<pre>';
        var_dump(Input::all());
        echo '</pre>';
    }

}

这是ajax部分:

$("#upload_employee_form").submit(function(e){
//    e.preventDefault();
//    alert("hey");

var d = new FormData(document.getElementById('upload_employee_form'));
d.append('password', $('.password').val());
d.append('referencecode', $('.ref_code').val());
console.log(d);
$.ajax({
    url: '/laravel/rsms/public/company-representative-create-user',
    data: d,
    type: 'POST',
    processData: false,
    success: function(res) {
        console.log(res);
        alert("Success!");
    },
    error: function() {
        alert("Something went wrong!");
    }
});

return false;
});

1 个答案:

答案 0 :(得分:0)

不,这不是应该做的:

var d = new FormData(document.getElementById('upload_employee_form'));
d.append('password', $('.password').val());
d.append('referencecode', $('.ref_code').val());

^你做错了。首先,当包含jquery时,使用本机DOM选择器没有意义。其次,如果您稍后添加更多字段该怎么办?你必须d.append(...)那些字段。

发送序列化表单的正确且非常常见的方法,包括文件:

$("form").submit(function(event){
  event.preventDefault();

  var data = new FormData($(this)[0]);

        $.ajax({
            // Note, both processData and contentType should be set to false
            processData : false,
            contentType : false,

            url     : "/laravel/rsms/public/company-representative-create-user",
            data    : data,
            success : function(response) {
                  alert(response);
            }
        });

});

即使您将来添加了一些字段,也不再需要d.append()。表单序列化完全是动态的。

至于服务器端,继续做你现在应该做的事情