【问题标题】:Laravel Ajax Input::all() return empty when send it via FormDataLaravel Ajax Input::all() 通过 FormData 发送时返回空
【发布时间】:2014-11-27 07:21:30
【问题描述】:

我正在使用 Laravel 4 构建一个应用程序,在某些时候我想通过 modal(Bootstrap) 添加一些模型,所以我需要 ajax 来发送我的来源,我已经在控制器中设置了我的路由和操作,然后我已经构建了使用刀片进行表单标记,我已经编写了 ajax 代码,请求正常,我通过 Input 门面检索输入,这里的问题是表单有一个文件输入,并且在使用 $('#formRub') 序列化表单数据时。 serialize(),它不能处理文件输入,所以我必须使用 FromData 对象,并在 ajax 请求中将 processData 和 contentType 设置为 false,请求发送,但是当你访问 Input 门面时,我得到了空数组! !

路线:

Route::post('/add', ['as' => 'rubrique.add.post', 'uses' => 'RubriquesController@ajaxaddpost']);

控制器:

class RubriquesController extends \BaseController {


public function ajaxaddpost(){
  return  dd(Input::all());
    $v = Validator::make(Input::all(), Rubrique::$rules);
    if($v->fails()){
        return Response::json([
            'fail' => true,
            'errors' => $v->errors()->toArray()
        ]);
    }
    if(Input::hasFile('image'))
        return Response::json(['success' => Input::file('image')]);

    return Response::json(['fail' => 400]);
}

标记:

         {{ Form::open(['route' => 'rubrique.add.post', 'method' => 'post', 'files' => true, 'class' => 'form-horizontal', 'id' => 'rubForm']) }}
                {{Form::label('name', 'Nom de la boutique :', ['class' => 'col-md-4 control-label'])}}
                    {{Form::text('name', null, ['class' => 'form-control', 'placeholder' => 'Entrer votre nom de boutique..'])}}

                {{Form::label('desc', 'Description :', ['class' => 'col-md-4 control-label'])}}
                    {{Form::textarea('desc', null, ['class' => 'form-control', 'placeholder' => 'Enter votre e-mail..', 'rows' => '3'])}}



                {{Form::label('image', 'Image :', ['class' => 'col-md-4 control-label'])}}
                    {{Form::file('image', ['class' => 'form-control', 'placeholder' => 'Enter votre e-mail..'])}}

                {{Form::label('rubrique_id', 'Rubrique Parent :', ['class' => 'col-md-4 control-label'])}}
                    {{ Form::rubriques(0) }}

            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                {{Form::submit('Ajouter', ['class' => 'btn btn-primary', 'id' => 'sendRubrique']) }}

            </div>
        </div>
        {{Form::close()}}

JS:

        $('#rubForm').submit(function(e){
            e.preventDefault();
            var $form = $( this ),
                dataFrom = new FormData($form),
                url = $form.attr( "action"),
                method = $form.attr( "method" );

            $.ajax({
                url: url,
                data: dataFrom,
                type: method,
                contentType: false,
                processData: false
            });
        });

【问题讨论】:

  • 我不需要用于上传的插件,我只需要以这种形式上传,所以你能帮我解释一下为什么这不起作用吗?

标签: javascript php jquery ajax laravel-4


【解决方案1】:

密钥在您的 ajax 请求中。在控制器中,您可以为所欲为。

var form = document.forms.namedItem("yourformname"); // high importance!, here you need change "yourformname" with the name of your form
var formdata = new FormData(form); // high importance!

$.ajax({
    async: true,
    type: "POST",
    dataType: "json", // or html if you want...
    contentType: false, // high importance!
    url: '{{ action('yourController@postMethod') }}', // you need change it.
    data: formdata, // high importance!
    processData: false, // high importance!
    success: function (data) {

        //do thing with data....

    },
    timeout: 10000
});

【讨论】:

    【解决方案2】:

    您的 JavaScript 应该如下所示:

    $('#rubForm').submit(function(e){
        e.preventDefault();
        var $form = $( this ),
            dataFrom = $form.serialize(),
            url = $form.attr( "action"),
            method = $form.attr( "method" );
    
        $.ajax({
            url: url,
            data: dataFrom,
            type: method,
            processData: false
        });
    });
    

    你应该使用$form.serialize(),你必须删除contentType: false,

    现在,如果您在控制器中放入类似这样的内容:

    file_put_contents("test.txt", var_export(Input::all(), true));
    

    它将创建包含数据的文件,但我不知道它是否适用于文件输入

    编辑

    我没有注意到问题中的 seralize() 和文件输入,所以现在,您应该在表单中添加 name 属性:

     {{ Form::open(['route' => 'rubrique.add.post', 'method' => 'post', 'files' => true, 'class' => 'form-horizontal', 'id' => 'rubForm', 'name' =>'myform']) }}
    

    并使用以下代码:

    $('#rubForm').submit(function(e){
        e.preventDefault();
        var $form = $( this ),
    
            dataFrom = new FormData(document.forms.namedItem("myform"));
            url = $form.attr( "action"),
            method = $form.attr( "method" );
    
        $.ajax({
            url: url,
            data: dataFrom,
            type: method,
            processData: false
        });
    });
    

    【讨论】:

    • 我认为您没有阅读我的问题描述,我已经这样做了,但是 $form.serialize 不适用于文件!
    • 非常感谢!你救了我的命!!,但如果你知道为什么普通选择器不起作用? document.forms 呢??
    • @Ilyass 我不知道你为什么要使用这样的语法,但你看到它有效(我在谷歌的一些文档中找到了它)
    【解决方案3】:

    那是因为发送带有 "data" 的数组,与 jquery ajax 相同,Input::all() 显示 [data]='_token=d76as78d6as87d6a&amp;data1=value1 等...如果您打印值 Input::all ,则不会作为 sincronized 请求给你看一个完整的数组,laravel 以不同的方式处理 jQuery 发送的 POST 请求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-27
      • 2014-06-03
      • 2015-08-28
      • 2015-12-26
      • 1970-01-01
      • 2016-12-24
      • 2021-05-22
      • 1970-01-01
      相关资源
      最近更新 更多