Laravel Ajax Input :: all () devuelve vacío cuando lo envía a través de FormData

Estoy construyendo una aplicación con Laravel 4, en algún punto quiero agregar algún modelo a través de modal (Bootstrap) así que necesitaba ajax para enviar mi, configuré mi ruta y acción en el controlador, y luego construí el marcado de forma con blade, he escrito el código ajax, la solicitud va bien y recupero las entradas a través de la entrada de la fachada, el problema aquí es que el formulario tiene una entrada de archivo, y al serializar los datos de forma con $ (‘# formRub’) .serialize () , no puede manejar la entrada del archivo, así que tengo que usar el objeto FromData y establecer el processData y el contentType en false en la solicitud ajax, la solicitud enviada, pero cuando accedo a la entrada de la fachada, ¡recibí el array vacío!

Ruta:

Route::post('/add', ['as' => 'rubrique.add.post', 'uses' => '[email protected]']);

Controlador :

 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]); } 

Margen :

  {{ 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 }); }); 

Tu JavaScript debería verse así:

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

Debe usar $form.serialize() y debe eliminar contentType: false,

Ahora si pones en tu controlador por ejemplo algo como esto:

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

creará archivos con datos, sin embargo, no sé si funcionarán para la entrada de archivos

EDITAR

No noté que seralize () y el archivo de entrada en la pregunta, por lo que ahora, debe agregar el atributo de nombre a su formulario:

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

y usa el siguiente código:

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

La clave está en tu solicitud de Ajax. En el controlador puedes hacer lo que quieras.

 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('[email protected]') }}', // you need change it. data: formdata, // high importance! processData: false, // high importance! success: function (data) { //do thing with data.... }, timeout: 10000 }); 

Esto se debe a que enviar la matriz con un “dato”, es lo mismo que jquery ajax, Input::all() muestra [data]='_token=d76as78d6as87d6a&data1=value1 etc … no como una solicitud sincronizada si usted imprime valores de Input::all le mostrarán una matriz completa, laravel maneja de una manera diferente las solicitudes POST enviadas por jQuery