【问题标题】:Laravel 4 TokenMissMatchException with PluploadLaravel 4 TokenMissMatchException 与 Plupload
【发布时间】:2015-03-11 21:53:09
【问题描述】:

我正在尝试使用 Plupload 上传文件,但我总是收到 TokenMissMatchException。

// Route
Route::post("/posts/gallery", "PostsController@uploadGallery");
// Controller action
    public function uploadGallery(){
        $file = Input::file('file');
        $destinationPath = public_path() . '/imgs';
        $extension = $file->getClientOriginalExtension();
        $filename = "post-" . str_random(12) . "." . $extension;

        $inFile = $file->getRealPath();
        $outFile = public_path() . "/imgs/" . $filename;

        $image = new Imagick($inFile);
        $image->thumbnailImage(550, 0);
        if($image->writeImage($outFile)){
            return Response::json(["response" => "ok", "img" => $filename]);
        }else{
            return Response::json(["response" => "error"]);
        }
    }

这是我尝试解决的问题。我尝试将_token 添加到请求中,但没有收到:

$("#uploader").pluploadQueue({
            runtimes : 'html5,flash,silverlight,html4',
            url : "{{ URL::action('PostsController@uploadGallery') }}",
            chunk_size: '1mb',
            rename : true,
            dragdrop: true,

            filters : {
                max_file_size : '3mb',
                mime_types: [
                    {title : "Image files", extensions : "jpg,gif,png"},
                ]
            },
            resize : {width : 320, height : 240, quality : 90},
            flash_swf_url : "<?php echo public_path() . '/js/Moxie.swf'; ?>",
            silverlight_xap_url : "<?php echo public_path() . '/js/Moxie.xap'; ?>",
            prevent_duplicates: true,
            multipart_params : {
                "_token" : $("[name=_token]").val()
            }
        });

在 filters.php 我有这个:

Route::filter('csrf', function() {
    $token = Request::ajax() ? Request::header('x-csrf-token') : Input::get('_token');
    if (Session::token() != $token){
        throw new Illuminate\Session\TokenMismatchException;
    }
});

有人可以帮我解决这个问题吗?

更新:

上传文件的html表单:

<div class="imageGallery">
    {{ Form::open() }}
        <div id="uploader">
            <p>Your browser doesn't have Flash, Silverlight or HTML5 support.</p>
        </div>
    {{ Form::close() }}
</div>

//隐藏输入框

<input type="hidden" value="VJRUpvq92oYxCsNHVBi5TqqkU6I6CQayay6x7L0m" name="_token">

【问题讨论】:

  • console.log($("input[name=_token]").val()) 是否返回任何内容?我只问因为选择器对我来说看起来很奇怪(但我可能是在想象事情)。
  • 不,它不会返回任何东西。我也尝试在 Firebug 控制台中执行 $("input[name=_token]").val() 但仍然没有
  • 嗯。现在这真的很奇怪......我唯一能想到的就是你遇到了一些其他错误,这些错误会阻止任何其他 JS 运行。加载页面/发出请求时控制台中有任何内容吗?
  • $("[name='_token']")$("input[name='_token']") 怎么样。您是否查看过页面的来源以确保输入确实存在?确保它不是您忘记包含的部分,或者某处没有某些 javascript 由于某种原因正在删除该元素。
  • $("input[name='_token']") 正在工作。谢谢@patricus

标签: php laravel laravel-4 csrf plupload


【解决方案1】:

如果上传是通过 ajax 完成的,您的 csrf 过滤器期望令牌位于“x-csrf-token”标头中,而不是输入中。

不要将令牌添加到multipart_params,而是尝试将其添加到headers

$("#uploader").pluploadQueue({
    runtimes : 'html5,flash,silverlight,html4',
    url : "{{ URL::action('PostsController@uploadGallery') }}",
    chunk_size: '1mb',
    rename : true,
    dragdrop: true,
    filters : {
        max_file_size : '3mb',
        mime_types: [
            {title : "Image files", extensions : "jpg,gif,png"},
        ]
    },
    resize : {width : 320, height : 240, quality : 90},
    flash_swf_url : "<?php echo public_path() . '/js/Moxie.swf'; ?>",
    silverlight_xap_url : "<?php echo public_path() . '/js/Moxie.xap'; ?>",
    prevent_duplicates: true,
    headers: {
        "x-csrf-token" : $("[name=_token]").val()
    }
});

编辑

除了上面的变化之外,确定javascript没有找到_token输入元素来获取值。该问题的解决方案是在 CSS 属性选择器中的值周围添加引号。

最终运行的 javascript:

$("input[name='_token']").val()

有关属性选择器的 CSS3 文档可以在 here 找到。尽管有些浏览器可以不使用引号,但它们提供的示例显示了被引用的选择器值。

【讨论】:

  • 即使使用您的新代码,我也遇到与以前相同的错误
  • 你能用来自 csrf 过滤器的调试信息更新你的问题吗?上传完成后,Request::ajax()Request::header('x-csrf-token')Input::get('_token')$tokenSession::token() 的值是多少?
  • 我得到了 TokenMismatchException。 $token 为空,而 Session::token() 包含令牌
  • @Alen $token 是空的,但为什么呢?是不是ajax调用?请求是否包含标头?在您的 javascript 中,$("[name=_token]").val() 实际上是否返回一个值?
  • $("[name=_token]").val() 返回空字符串。是的,它是 ajax 调用
猜你喜欢
  • 2017-06-12
  • 2014-10-26
  • 2016-12-26
  • 2011-01-21
  • 1970-01-01
  • 2021-03-19
  • 2013-11-20
  • 2014-04-10
  • 2014-06-29
相关资源
最近更新 更多