在 Laravel 5.8 中验证 .tar 文件上传

Validate .tar file upload in Laravel 5.8

我有这个代码

$inputs    = Input::all();
$file      = Input::file('file');
$validator = Validator::make($request->all(), [
    'file' => 'required|max:50000|mimes:application/x-tar',
]);

if ($validator->fails()) {

    $messages = $validator->messages();
    dd($file,$messages); <<<< --- keep executing 


    return Redirect::to('/vnf-packages/create')->withErrors($validator)->withInput()
    ->with('error','Something is wrong with your upload image');
} else {
..
}

我不知道为什么它一直进入失败块。 我确实用 .tar.

上传了文件

我的代码中是否遗漏了任何内容?


已更新

如您所见,我确实上传了 .tar 文件

dd($file,$messages);

UploadedFile {#446 ▼
  -test: false
  -originalName: "config-vnfp-vyos-567.tar"
  -mimeType: "application/x-tar"
  -error: 0
  #hashName: null
  path: "/private/var/tmp"
  filename: "phpNaZGxr"
  basename: "phpNaZGxr"
  pathname: "/private/var/tmp/phpNaZGxr"
  extension: ""
  realPath: "/private/var/tmp/phpNaZGxr"
  aTime: 2020-03-09 15:10:28
  mTime: 2020-03-09 15:10:28
  cTime: 2020-03-09 15:10:28
  inode: 14703131
  size: 140
  perms: 0100600
  owner: 70
  group: 0
  type: "file"
  writable: true
  readable: true
  executable: false
  file: true
  dir: false
  link: false
}
MessageBag {#454 ▼
  #messages: array:1 [▼
    "file" => array:1 [▼
      0 => "The file must be a file of type: tar."
    ]
  ]
  #format: ":message"
}

已更新 2

'file' => 'required|max:50000|mimes:tar', //fail 
'file' => 'required|max:50000|mimes:application/x-tar', //fail 
'file' => 'required', //success 

我尝试使用 .tar 文件测试上传,当我使用 getMimeType 方法时,它 returns 如下:

application/gzip

所以你的验证规则应该是:

'file' => 'required|mimetypes:application/gzip',

如果你想使用 mimes 规则,你需要这样的东西:

'file' => 'required|mimes:gz',

通过一些研究,我发现了以下内容:https://superuser.com/questions/901962/what-is-the-correct-mime-type-for-a-tar-gz-file

您可以在 Illuminate/Validation/Concerns/ValidatesAttributes.php 中找到有关验证器如何验证这两个规则的更多信息。

validateMimes方法使用文件的guessExtension()方法,returnsgz.

$value->getPath() !== '' && in_array($value->guessExtension(), $parameters)

并且 validateMimeTypes 方法检查使用文件的 getMimeType() 方法 returns application/gzip.

return $value->getPath() !== '' &&
    (in_array($value->getMimeType(), $parameters) ||
    in_array(explode('/', $value->getMimeType())[0].'/*', $parameters));