CSRF令牌在Laravel 5中以文件上载形式到期

时间:2015-03-12 13:30:42

标签: laravel csrf laravel-5

我有一个文件上传表单,其中包含 csrf令牌的隐藏字段。当文件小于1MB时,一切正常,但是当我上传大文件时,请求会花费更多时间,而且令牌似乎已过期,因为我得到了TokenMismatchException,对此有什么解决方法吗?感谢

这是我的表格:

<form method="POST" action="" enctype="multipart/form-data">
        <input type="hidden" name="_token" value="{{{ csrf_token() }}}" />
        <input type="hidden" name="user_id" value="{{ $user->id }}" />

        <div class="form-group">
            <label for="file">File</label>
            <input type="file" name="file" />
        </div>
</form>

这是我的控制者:

public function store(Request $request)
{
    $file = $request->file('file');
    $fileName = $file->getClientOriginalName();

    $user     = User::findOrFail ($request->get('user_id'));
    $filePath = "/app/files/$user->id/";
    $file->move(storage_path().$filePath, $fileName);

    return redirect('/users/' . $user->id . '/files')->with('uploaded', true);
}

4 个答案:

答案 0 :(得分:2)

检查upload_max_filesize和php.ini中的post_max_size是否足以支持您的文件大小。如果post_max_size太低,则发布的输入将被截断,并且CSRF令牌不会通过。

请不要关闭CSRF或将其视为在某些端点上被忽略......

答案 1 :(得分:0)

<input type="hidden" name="_token" value="{{{ csrf_token() }}}" />

请参阅,您已经写了{{{csrf_token()}}}

您应该写{{csrf_token()}}

答案 2 :(得分:0)

您需要在表单中指定 CSRF,如下所示:

<form method="POST" action="" enctype="multipart/form-data">
@csrf
(...)

Laravel Documentation

答案 3 :(得分:-1)

您可以修改CSRF中间件(位于app/Http/Middleware中)以忽略该控制器操作:

public function handle($request, Closure $next)
{
    if(\Route::is('path/to/form')) {
        return $next($request);
    }

    return parent::handle($request, $next);
}