upload - 上传太大的文件时 Laravel token 不匹配

标签 upload laravel token mismatch

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

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

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

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

最佳答案

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

我正在使用 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;
    }
});

显然,除了过大的图像之外,其他因素也可能导致 Content-Length 溢出,但这不太可能,所以我认为这是一个合理的风险。

关于upload - 上传太大的文件时 Laravel token 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20022960/

相关文章:

batch-file - 如何在 BAT For 中获取 token 2 以后

javascript - 需要一个带有 multipart/form-data 的 AJAX Javascript 库

PHP mkdir 失败

php - Laravel Auth - 使用 md5 而不是集成的 Hash::make()

PHP mcrypt安装和设置laravel环境问题

php - Laravel session 之间的差异 :token and csrf_token

c# - 在 Facebook c# sdk 中转换从调试 token 提交的 expires_at

http - 无法通过 Squid 代理测试基于 HTTP PUT 的文件上传

jquery - 如何在 Rails 4 中使用 jQuery 文件上传?

php - 我如何确定所有集合都已填充?