Laravel 5.5 文件扩展验证不起作用

Posted

技术标签:

【中文标题】Laravel 5.5 文件扩展验证不起作用【英文标题】:Laravel 5.5 file extension validation not working 【发布时间】:2018-07-12 20:39:42 【问题描述】:

要求:用户只能上传pdf、word文档、excel或powerpoint。 我已经尝试了这些验证规则,但它们都不起作用:

'fileUpload' => 'sometimes|mimes:doc,docx,xls,xlsx,ppt,pdf,zip|max:2048',

我也尝试过以下规则来测试 pdf。

'fileUpload' => 'sometimes|mimetypes:application/pdf|max:2048',
'fileUpload' =>  'sometimes|mimetypes:pdf|max:2048',
'fileUpload' =>  'sometimes|mimes:application/pdf|max:2048',
'fileUpload' =>  'sometimes|mimes:pdf|max:2048',

当我尝试上传任何文件时,第一条规则说:

The file upload must be a file of type: doc, docx, xls, xlsx, ppt, pdf, zip.

第二条规则说:

The file upload must be a file of type: application/pdf.

我也尝试过更改规则安排,但仍然是同样的问题。

我正在手动处理此要求。但想知道为什么这些验证规则不起作用。

【问题讨论】:

你从哪里得到sometimes 规则? @afraz 一些二进制文件的 mime 类型被错误地识别为 binary/octet-stream 而不是它们的实际类型。你可以在 UploadedFile 的实例上调用 guessExtension() 函数来查看文件是什么 mime 类型的 Laravel 东西。 我尝试使用 $file->getMimeType(); 检查 mime 类型这些是正确的。意味着当我上传 pdf 时,它会显示 application/pdf。并且 guessExtension() 也返回 pdf。 @btl 有时是 laravel 提供的用于验证输入(如果可用)的规则。 哦,有趣,我不知道那个。看起来很有用。 【参考方案1】:

按照 5.5 documentation

MIME 规则的基本用法

'photo' => 'mimes:jpeg,bmp,png'

即使您只需要指定扩展名,此规则 实际上通过读取文件的 MIME 类型来验证 文件的内容并猜测它的 MIME 类型。

可以在以下位置找到 MIME 类型及其相应扩展名的完整列表:https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

只需尝试一次完整的扩展

'fileUpload' => 'sometimes|mimes:application/pdf|max:2048',

【讨论】:

【参考方案2】:

我找到了原因。我试图上传多个文件,并且验证规则应该像这样验证数组

'fileUpload.*'. instead of just 'fileUpload'

我只是错过了 * 。 因为我的输入框正在上传多个文件

<input  type="file" name="fileUpload[]" multiple />

【讨论】:

以上是关于Laravel 5.5 文件扩展验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 - 图像验证不起作用

App Debug在Laravel 5.5中不起作用

Laravel 5.5 路由中的模型绑定不起作用

Laravel 5 - 图像验证不起作用

laravel 5 中的 .blade 扩展不起作用?

Laravel 8 - 旧输入和验证错误消息不起作用