原来 Symfony ExtensionGuesser 和 MimeTypeGuesser 使用了不可靠的 FileInfo 类。因此,对 mime 的验证会返回不可预测的结果,并且不能以正确的方式用于文件上传(它会返回 text/plain mime for js、xls、po 等)。
我已经为这个问题找到了非常简单的解决方案。
代替
'attachment' => 'required|mimes:jpg,jpeg,bmp,png,doc,docx,zip,rar,pdf,rtf,xlsx,xls,txt|max:10000',
我把它分成两个不同的部分,现在我的验证看起来像这样:
private function createFileAttachmentValidator($file)
{
return Validator::make(
[
'attachment' => $file,
'extension' => \Str::lower($file->getClientOriginalExtension()),
],
[
'attachment' => 'required|max:10000',
'extension' => 'required|in:jpg,jpeg,bmp,png,doc,docx,zip,rar,pdf,rtf,xlsx,xls,txt',
],
$this->validationMessages()
);
}
我只是尝试验证文件的扩展名是否存在以及它是否列在我的in 规则中。这行得通,但是,解决方案并不完美。