Laravel 5 - 使用CSRF保护上传AJAX图像

时间:2015-11-15 22:37:56

标签: php jquery ajax laravel-5

我设置了一个表单来上传图片。我以前使用DropZone.js工作正常,并发送CSRF令牌和ajax调用。服务器端的一切都很好,但是在没有DropZone的情况下尝试这样做时,我会收到令牌不匹配错误。

这是我的AJAX电话:

    $(document).on('submit', ".hidden-image-upload", function(e){
    e.preventDefault();
    $.ajax({
        url:'/project/uploadImage',
        data:{
            data:new FormData($("#upload_form")[0]),
        },
        dataType:'json',
        async:false,
        type:'post',
        processData: false,
        contentType: false,
        success:function(response){
            console.log(response);
        },
    });
});

这是HTML:

<form method="POST" action="http://localhost/project/create" accept-charset="UTF-8" class="hidden-image-upload">
    <input name="_token" type="hidden" value="5lgtt8AgbeF3lprptj8HNXVPceRhoJbqBeErBI1k">
    <input class="cover-image-upload-button" name="file" type="file">
</form>

如何整理我的AJAX调用/ Laravel以协同工作?

2 个答案:

答案 0 :(得分:5)

您可以使用$ .ajax在标头中发送令牌。

$(document).on('submit', ".hidden-image-upload", function(e){
    e.preventDefault();
    $.ajax({
        url:'/project/uploadImage',
        data:{
            data:new FormData($("#upload_form")[0]),
        },
        headers: {
           'X-CSRF-Token': $('form.hidden-image-upload [name="_token"]').val()
        }
        dataType:'json',
        async:false,
        type:'post',
        processData: false,
        contentType: false,
        success:function(response){
            console.log(response);
        },
    });
});

在最坏的情况下,在该路由中禁用CSRF检查,只需添加数组$中的路由,除了app / Http / Middleware / VerifyCsrfToken.php

答案 1 :(得分:0)

试试这个。您还必须将CSRF令牌与FormData一起传递:

$(document).on('submit', ".hidden-image-upload", function(e){
e.preventDefault();

var data = new FormData($("#upload_form")[0]);
    data.append('_token', $('input[name="token"]').val());

$.ajax({
    url:'/project/uploadImage',
    data:{
        data: data,
    },
    dataType:'json',
    async:false,
    type:'post',
    processData: false,
    contentType: false,
    success:function(response){
        console.log(response);
    },
});

});