上传太大的文件时,Laravel令牌不匹配

时间:2013-11-16 19:44:23

标签: upload laravel token mismatch

我正在使用Laravel 4,并且在允许用户添加附件的电子邮件表单中,当我尝试提交超出我的php.ini中设置的post_max_size的文件时,我收到了令牌不匹配错误。我将这些行放在csrf过滤器中以尝试调试:

Log::debug(Session::token());
Log::debug(print_r($_POST, true));
Log::debug(Input::get('_token'));
Log::debug(Session::token() != Input::get('_token'));

可以预见,$ _POST为空,因此会话令牌总是与null进行比较。但有没有办法优雅地让用户知道文件太大而不是抛出这个错误?

我也在使用javascript验证器,但我不想完全依赖javascript来避免抛出此错误。

2 个答案:

答案 0 :(得分:2)

我意识到这是一个老问题,但我遇到了它,我无法找到任何解释这个问题的解决方案。所以,我想我会发布我的解决方案。

我正在使用Laravel 4.1,在app / filters.php中我将Route :: filter('csrf'。function()更改为:

Route::filter('csrf', function()
{
    if (Session::token() != Input::get('_token'))
    {
        if (empty($_POST)) {
            $post_size = trim(ini_get('post_max_size'));
            $post_size = substr($post_size, 0, -1);
            $post_size = ($post_size * 1024) * 1024;

            if ($post_size < Request::header('Content-Length')) {
                $validator = Validator::make(Input::all(), []);

                $messages = $validator->errors();
                $messages->add('file size', 'Files Cannot Exceed ' . ini_get('upload_max_filesize'));

                return Redirect::back()->withErrors($messages);
            }
        }

        throw new Illuminate\Session\TokenMismatchException;
    }
});

显然,除了过大的图像之外的其他事情可能会导致内容长度溢出,但这种可能性很小,所以我认为这将是一个合理的风险。

答案 1 :(得分:2)

点击下面的链接,显然问题是由超出最大上传大小引起的。 solved