2014-09-02 46 views
1

我使用dropzone.js將圖像上傳到我的網站,但Laravel總是報告TokenMismatchException,儘管我在表單中使用了Form::open(),它自動添加了_tokenLaravel-Tokenmissmatchexception with Dropzone.js

這是我的代碼:

{{ Form::open(["class" => "dropzone", "id" => "imgUpload", "action" => "[email protected]"]) }} 
    <div class="fallback"> 
     {{ Form::submit() }} 
    </div> 
{{ Form::close() }} 

JS

Dropzone.options.imgUpload = { 
     paramName: "file", 
     dictDefaultMessage: "Pošalji sliku", 
     acceptedFiles: "image/*", 
     previewsContainer: ".dropzone-previews", 
     uploadprogress: function(progress, bytesSent){ 
      console.log(progress); 
    } 
}; 

如何解決這個問題?

+0

您是否在'UploadsController'構造函數中設置了任何過濾器?即...'$ this-> beforeFilter()' – user3158900 2014-09-02 15:45:44

+0

我在路由中添加了全局保護:Route :: when('*','csrf',array('post','put','delete')); – Alen 2014-09-02 15:47:55

回答

1

看起來好像Dropzone在通過AJAX發佈時不包括令牌。您可以使用這樣的事情讓它做這樣....

Dropzone.options.imgUpload = { 
    paramName: "file", 
    dictDefaultMessage: "Pošalji sliku", 
    acceptedFiles: "image/*", 
    previewsContainer: ".dropzone-previews", 
    uploadprogress: function(progress, bytesSent) { 
     console.log(progress); 
    }, 
    sending: function(file, xhr, formData) { 
      // Pass token. You can use the same method to pass any other values as well such as a id to associate the image with for example. 
      formData.append("_token", $('[name=_token']).val()); // Laravel expect the token post value to be named _token by default 
     } 
}; 

,我發現這裏的一段:http://laravel.io/forum/04-17-2014-tokenmismatchexception-with-dropzonejs

它也像有一些問題,令牌和形式通過提交AJAX。在這種情況下,當初始化dropzone時,您會希望包含額外的標頭。

Dropzone.options.imgUpload = { 
    paramName: "file", 
    dictDefaultMessage: "Pošalji sliku", 
    acceptedFiles: "image/*", 
    previewsContainer: ".dropzone-previews", 
    headers: { 
     "X-CSRF-Token": $('[name=_token').val()) 
    }, 
    uploadprogress: function(progress, bytesSent) { 
     console.log(progress); 
    } 
}; 

,並利用這一點,修改filters.php你CSRF過濾器以檢查頭,如果我們是通過AJAX提交。

Route::filter('csrf', function() 
{ 
    $token = Request::ajax() ? Request::header('X-CSRF-Token') : Input::get('_token'); 

    if (Session::token() != $token) { 
     throw new Illuminate\Session\TokenMismatchException; 
    } 
}); 
+0

我以前試過,但它是一樣的。當我打開FireBug時,我可以看到dropzone正在發送_token,並且當我包含您的代碼時,它會發送_token兩次,所以必須有另一個問題。 – Alen 2014-09-02 16:01:18

+0

我只是將meta標記中的token與dropzone ajax請求中的標記進行比較,它們完全相同,因此可能是什麼問題。 – Alen 2014-09-02 16:30:28

+0

我可能有另一個想法,你可以更新你的問題,但包括你的CSRF過濾器? – user3158900 2014-09-02 17:16:15