2014-10-02 113 views
1

即時通過Laravel 4構建應用程序,在某些時候我想通過模式(Bootstrap)添加一些模型,所以我需要ajax來發送我的消息,我在控制器中設置了我的路線和動作,然後我用刀片建立了表格標記,我寫了ajax代碼,請求很好,我通過Input facade檢索輸入,這裏的問題是表單有一個文件輸入,當使用$('#formRub').serialize()序列化表單數據時,它無法處理文件輸入,所以我必須使用FromData對象,並在ajax請求中將processData和contentType設置爲false,請求發送,但我當你訪問輸入門面我有空陣列!Laravel Ajax Input :: all()通過FormData發送時返回空值

路線:

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

控制器:

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 
      }); 
     }); 
+0

試試這個插件 http://blueimp.github.io/jQuery-File-Upload/ – justrohu 2014-10-02 10:06:51

+0

我不想上載一個插件,我只需要在只有這種形式上傳,這樣可以幫助我爲什麼這不起作用? – 2014-10-02 10:20:14

回答

1

你的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 
    }); 
}); 
+0

我不認爲你已經閱讀我的問題描述,我已經這樣做了,但$ form.serialize不適用於文件! – 2014-10-02 10:59:04

+0

@Ilyass我編輯了我的答案 – 2014-10-02 11:09:56

+0

謝謝sooooo多!!你救了我的命!!但是如果你知道爲什麼正常的選擇器不起作用?什麼與document.forms? – 2014-10-02 12:22:37

1

這是因爲在發送與「數據」的排列,相同jQuery的阿賈克斯,在Input::all()正顯示出[data]='_token=d76as78d6as87d6a&data1=value1等..不作爲sincronized要求,如果你首席t值Input::all會告訴你一個完整的數組,laravel處理jQuery發送的POST請求的不同方式

2

關鍵在你的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('[email protected]') }}', // you need change it. 
    data: formdata, // high importance! 
    processData: false, // high importance! 
    success: function (data) { 

     //do thing with data.... 

    }, 
    timeout: 10000 
});