在我的应用程序中,用户可以上传几个特定类型的文件,其中一个需要是一个据称较旧的excel文件类型application/vnd.ms-office
。
我有mime:xls,doc,csv
,但这些不能验证mime类型application/vnd.ms-office
我已经看了一些其他的地方,使验证器规则mime:xls,doc,csv,application/vnd.ms-office
不工作。
如果我编辑SymfonyComponentHttpFoundationFileMimeTypeMimeTypeExtensionGuesser
以包含'application/vnd.ms-office' => 'office'
并调整验证器规则为mime:xls,doc,csv,office
,我可以让它工作,但我将失去下次我通过编写器更新。
有什么方法可以即时操作mime类型数组吗?
此外,application/vnd.ms-office
似乎可能包含广泛的文件。我应该允许这样吗?
事实证明,我已经设法通过使用自定义验证器来获得我正在寻找的结果。
如果一段时间后我没有得到更好的答案,我就把这个标记为正确答案。
top of class:
use SymfonyComponentHttpFoundationFileUploadedFile;
在post函数内:
Validator::extend('uploadable', function($attr, $file, $params)
{
return $file instanceof UploadedFile
&& in_array($file->getMimeType(), array(
'application/msword',
'application/vnd.oasis.opendocument.text',
'application/vnd.ms-excel',
'application/pdf',
'text/html',
'text/rtf',
'text/csv',
'image/vnd.adobe.photoshop',
'application/zip',
'application/vnd.ms-office',
));
});
$validator = Validator::make(
Input::all(),
array(
'byMail' => 'in:Y',
'file1' => 'uploadable',
'file2' => 'uploadable',
'file3' => 'uploadable',
),
(array) Lang::get('errors.upload')
);
我有一个类似的问题,想验证一些额外的MIME类型,但不想失去Symfony的基本验证。
我扩展了Symfony的验证,将以下内容添加到AppService provider中,并在验证规则中使用extended_mimes而不是mimes。
Validator::extend('extended_mimes', function($attr, $file, $parameters)
{
// get the file's MIME type
$mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $file);
// get Symfony's guesser
$guesser = new MimeTypeExtensionGuesser;
// create bonus guesses
$bonus_guesses = [
'application/vnd.ms-office' => 'xls',
];
$bonus_guess = isset($bonus_guesses[$mime]) ? $bonus_guesses[$mime] : null;
// check whether we either hit a correct guess, or we make a hit in a bonus guess
return in_array($guesser -> guess($mime), $parameters) || in_array($bonus_guess, $parameters);
});
只要添加任何你想要的奖金猜测来设置额外的mime及其扩展。
你需要在AppServiceProvider的顶部包含Validator和SymfonyComponentHttpFoundationFileMimeType mimeypeextensionguesser。