Обратите внимание, что при проверке MIME-типа Laravel считывает содержимое файла, чтобы определить его тип, поэтому изменение расширения изображения с .jpg
на .xml
не приведет к его обману
Из Документы
mimes: foo, bar , ...
Проверяемый файл должен иметь тип MIME, соответствующий одному изперечисленные расширения.
Основное использование правила MIME
'photo' => 'mimes:jpeg,bmp,png'
Несмотря на то, что вам нужно только указать расширения, это правило фактически проверяет тип файла MIME, читая содержимое файла.и угадывая его тип MIME.
Полный список типов MIME и их соответствующих расширений можно найти по следующему адресу: https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
Поэтому убедитесь, что ваш файл является действительным действительным XML-файлом.(попробуйте это с phpunit.xml) из вашего проекта Laravel
Route::post('/', function (Request $request) {
if ($request->input('action') == 'upload_document') {
$validator = Validator::make(
$request->all(),
[
'file' => 'bail|required|mimes:application/xml,xml|max:10000',
]
);
$validator->validate();
dd('the file is valid');
}
});
И такая форма
<form method="post" enctype="multipart/form-data">
@csrf
<input name="action" value="upload_document">
<input type="file" name="file">
<button type="submit">Submit</button>
</form>
@error('file')
{{ $message }}
@enderror
Результат:
"the file is valid"
Но при тестировании сimage.xml
The file must be a file of type: application/xml, xml.
В качестве альтернативы,вы можете проверить по расширению
Route::post('/', function (Request $request) {
if ($request->input('action') == 'upload_document') {
$request->validate([
'file' => [
'bail',
'required',
'max:10000',
function ($attribute, $value, $fail) {
if ($value->getClientMimeType() !== 'text/xml') {
$fail($attribute.'\'s extension is invalid.');
}
},
]
]);
dd('the file is valid');
}
});
Теперь файл изображения с расширением xml
проходит проверку
См. с использованием замыканий для пользовательской проверки