【问题标题】:Laravel - Tokenmissmatchexception with Dropzone.jsLaravel - 带有 Dropzone.js 的 Tokenmissmatchexception
【发布时间】:2014-10-26 22:44:40
【问题描述】:

我使用 dropzone.js 将图像上传到我的网站,但 Laravel 总是报告 TokenMismatchException,尽管我在表单中使用 Form::open(),它会自动添加 _token

这是我的代码:

{{ Form::open(["class" => "dropzone", "id" => "imgUpload", "action" => "UploadsController@uploadImage"]) }}
    <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);
   }
};

如何解决?

【问题讨论】:

  • 您是否在UploadsController 构造函数中设置了过滤器?即...$this-&gt;beforeFilter()
  • 我在路由中添加了全局保护:Route::when('*', 'csrf', array('post', 'put', 'delete'));

标签: javascript laravel laravel-4 dropzone.js


【解决方案1】:

在通过 AJAX 发布时,Dropzone 似乎不包含令牌。你可以使用这样的东西来做到这一点......

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

我在这里找到了 sn-p...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);
    }
};

如果我们通过 AJAX 提交,请修改 filters.php 中的 CSRF 过滤器以检查该标头。

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

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

【讨论】:

  • 我以前试过这个,但它是一样的。当我打开FireBug时,我可以看到dropzone正在发送_token,而当我包含你的代码时,它会发送两次_token,所以肯定是另一个问题。
  • 我刚刚比较了meta标签中的token和dropzone ajax请求中的token,它们完全一样,那么可能是什么问题。
  • 我可能有另一个想法,您能否更新您的问题以包含您的 CSRF 过滤器?
  • 同样的事情,真的很奇怪。在我从 filters.php 中删除 csrf 过滤器后,一切正常,但当然我的应用程序没有受到保护。
  • 这很奇怪。看看在你的过滤器中,你可以var_dump(Session::token()),看看它在用firebug检查时是否返回任何值。
猜你喜欢
  • 2017-06-12
  • 2015-03-11
  • 2017-08-27
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多