Laravel Ajax Input :: all()在通过FormData发送时返回空

我用Laravel 4构建应用程序,在某些方面我想通过模态(Bootstrap)添加一些模型,所以我需要ajax来发送我的,我已经在控制器中设置我的路由和操作,然后我已经构建了表单标记与刀片,我已经写了ajax代码,请求很顺利,我通过输入外观检索输入,这里的问题是表单有一个文件输入,并在使用$(’#formRub’).serialize()序列化表单数据时,它无法处理文件输入,所以我必须使用FromData对象并在ajax请求中将processData和contentType设置为false,请求发送,但是当我访问Input facade时我得到了空数组!!

路线:

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) }}  
{{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应如下所示:

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

关键在于你的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 }); 

那是因为发送带有“数据”的数组,与jquery ajax相同, Input::all()显示[data]='_token=d76as78d6as87d6a&data1=value1等…而不是作为sincronized请求你打印值Input::all将显示一个完整的数组,laravel处理jQuery发送的POST请求的不同方式