【问题标题】:Laravel file upload validation doesn't trigger - TokenMismatchExceptionLaravel 文件上传验证不会触发 - TokenMismatchException
【发布时间】:2016-11-10 13:36:16
【问题描述】:

如果文件符合此验证规则,我可以上传文件

'user_file' => 'file|max:10240|mimes:xls,xlsx,doc,docx,pdf,zip'

一切顺利。

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

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

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

【问题讨论】:

    标签: php laravel file-upload


    【解决方案1】:

    当您超过发布有效负载大小时 - 一切都被丢弃,因此 csrf_token 不会来到 laravel 并且上传文件是空的,因此无法验证。

    更新

    要解决此问题,您需要在使用 javascript 或 jquery 上传之前检查文件大小

    这是一个例子:

    How to check file input size with jQuery?

    【讨论】:

    • 但是我怎样才能给用户一些反馈呢? tokenmissmatch 太疯狂了……或者我应该增加上传文件的大小
    • 我现在发现了这个laravel.io/forum/…,你说的对后有效载荷大小是正确的
    • @lewis4u 你根本做不到。您应该使用 javascript 进行文件大小检查。或者您可以禁用该特定路由的 csrf 检查,然后检查是否没有数据从请求传递到。
    • 我想我可以通过检查控制器中的文件大小来解决这个问题
    • @lewis4u 如果您达到 PHP post_max 限制 - 您将无法向控制器获取任何数据,因此您无需验证 :)
    【解决方案2】:

    在文件上传的情况下,必须将文件复制到临时位置到服务器中,然后规则才会起作用。因此您的服务器将不允许大小大于 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('')
        }
      }
    });
    

    您可以通过更改大小限制(以字节为单位)将其包含在 type='file' 的所有输入中。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。您还应该检查验证器是否正在检查 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'
      ]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-30
        • 2023-04-01
        • 2014-06-30
        • 1970-01-01
        • 2017-02-12
        • 2023-03-03
        • 2020-11-29
        • 2016-02-25
        相关资源
        最近更新 更多