2016-11-29 50 views
3

通过wysiwyg编辑器上传图像时,我需要将Laravel CSRF令牌与FormData()一起传递。但它似乎失败了,或者它不会使用append()方法添加csrf标记。使用表单数据添加laravel CSRF令牌

这里是我的代码:

function uploadImage(image) { 
    var data = new FormData(); 
    data.append("image", image); 

    data.append("csrfToken", Laravel.csrfToken); // <- adding csrf token 
    // Laravel.csrfToken will return the csrf token. 

    console.log(data.entries()); 
    $.ajax ({ 
     data: data, 
     type: "POST", 
     url: "/article/store/image", 
     cache: false, 
     contentType: false, 
     processData: false, 
     success: function(url) { 
     var image = IMAGE_PATH + url; 
      $('#editor').summernote("insertImage", image); 
     }, 
     error: function(data) { 
      console.log(data); 
     } 
    }); 
    } 

enter image description here

它不与表单数据添加laravel CSRF令牌,因为我仍收到错误

TokenMismatchException在VerifyCsrfToken.php line 68

如何添加带有表单数据的令牌?

+0

什么'Laravel.csrfToken'回报? –

+0

@SaumyaRastogi只是令牌字符串。 – rakibtg

回答

7

您应该添加一个名为场 - _token,而不是csrfToken这样的:

data.append("_token", Laravel.csrfToken); // <- adding csrf token 

这是Laravel的助手方法 - csrf_field()一样。

Laravel Docs,在阿贾克斯的情况下调用 - 你可以,例如,存储在一个HTML meta标签::

<meta name="csrf-token" content="{{ csrf_token() }}"> 

令牌,然后包括你的Ajax标题是这样的:

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 

希望这会有所帮助!

2

对于ajax请求,我喜欢用$ .ajaxSetup设置一次。

在我的布局:

<meta name="csrf-token" content="{{ csrf_token() }}"> 

在我app.js:

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 

这节省了我不必记住到_token输入追加到每一个要求。

2

而@Saumya已经回答了这个问题,我用头发送CSRF令牌就像这样:

$.ajax ({ 
    data: data, 
    type: "POST", 
    headers: {'X-CSRF-TOKEN': Laravel.csrfToken }, 
    url: "/article/store/image", 
    cache: false, 
    contentType: false, 
    processData: false, 
    success: function(url) { 
    var image = IMAGE_PATH + url; 
     $('#editor').summernote("insertImage", image); 
    }, 
    error: function(data) { 
     console.log(data); 
    } 
}); 

如果您正在使用AJAX来在整个应用程序发送多个请求,你可以将它设置为全球每请求一次:

$.ajaxSetup({ 
headers: { 
    'X-CSRF-TOKEN': Laravel.csrfToken 
} 
}); 

了解更多Here