我有一个文件上传表单,其中包含 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);
}
答案 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
(...)
答案 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);
}