Laravel文件上传验证不触发 - TokenMismatchException

3
如果文件符合验证规则,我可以上传这些文件。
'user_file' => 'file|max:10240|mimes:xls,xlsx,doc,docx,pdf,zip'

一切正常。

我已将php.ini中的upload_max_filesize设置为32MB,post_max_size设置为40MB。

但是,如果我尝试上传大于40MB的文件,则我的验证规则甚至不会触发。我会得到TokenMismatchException错误...

如果有人可以通过简单尝试上传一些非常大的文件(例如视频文件)来验证此问题。

3个回答

2
当您超出帖子有效载荷大小时,所有内容都会被丢弃,因此csrf_token不会传递到laravel,上传的文件为空,因此无法进行验证。
更新
为了解决这个问题,您需要在上传之前使用JavaScript或jQuery检查文件大小。
以下是一个示例: 如何使用jQuery检查文件输入大小?

但是我如何向用户提供一些反馈呢?TokenMissmatch 真的很疯狂...或者我应该增加上传文件的大小。 - lewis4u
我现在找到了这个链接:http://laravel.io/forum/02-20-2014-l40-csrf-tokenmismatchexception-when-uploading-large-files,你说的关于POST负载大小的问题是正确的。 - lewis4u
@lewis4u,你无法这样做。你应该使用JavaScript进行文件大小检查。或者你可以禁用特定路由的CSRF检查,然后检查是否没有从请求中传递数据。 - Giedrius Kiršys
我觉得我可以在控制器中通过检查文件大小来修复这个问题。 - lewis4u
1
@lewis4u 如果您达到了PHP post_max限制 - 您将无法获取任何数据到控制器,因此您没有任何内容可验证 :) - Giedrius Kiršys
是的,你说得对...所以在用户点击提交按钮之前,我需要检查文件大小...否则,如果文件太大,我会遇到令牌不匹配的问题。 - lewis4u

1
在文件上传的情况下,文件必须被复制到服务器的临时位置,然后规则才能生效。因此,您的服务器不允许大小超过40MB(post_max_size)的文件进入临时位置,因此规则将无法生效。 相反,为了解决这个问题,您需要对文件进行前端验证。 您可以使用简单的Javascript来实现,如下所示,
$('input[type="file"]').change(function () {
if (this.files[0] != undefined) {
    var name = this.name;
    var filesize = this.files[0].size;
    var field = $('#' + this.name).parents('.input-group');

    //check if file size is larger than 3MB(which is 3e+6 bytes)
    if (filesize > 3000000) {
       alert(filesize);
    //reset that input field if its file size is more than 3MB
       $('[name="' + name + '"]').val('')
    }
  }
});

您可以通过更改以字节为单位的大小限制,将此内容包括在所有类型为'file'的输入中。


0

我遇到了同样的问题。你也应该检查验证器是否检查了file数据,而不是post数据:

我已经测试过:

$validator = Validator::make($request->post(), [
    myfield' => 'required|image|mimes:jpeg,png,jpg,gif|max:1000000'
]);

应该是:

$validator = Validator::make($request->file(), [
    myfield' => 'required|image|mimes:jpeg,png,jpg,gif|max:1000000'
]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接