Проверьте тип MIME XML в Laravel - PullRequest
       0

Проверьте тип MIME XML в Laravel

0 голосов
/ 24 сентября 2019

У меня установлен валидатор, чтобы проверить, является ли загружаемый нами документ файлом XML

if ($request->input('action') == 'upload_document') {
    $validator = Validator::make($request->all(), [
        'file' => 'bail|required|mimes:application/xml,xml|max:10000',
        ]
    );
}

Но когда я делаю свою загрузку, этот валидатор выдает мне ошибку «Файл должен быть типа application /xml, xml ", даже когда я удаляю настоящий XML-файл с расширением .xml.

У меня в расширении конфигурации php.ini = php_fileinfo.dll, конечно,

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Обратите внимание, что при проверке 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 проходит проверку

См. с использованием замыканий для пользовательской проверки

0 голосов
/ 27 сентября 2019

Кажется, что XML, предоставленный внешней компанией, не соответствует надлежащему стандарту XML.

Поскольку он не в моих руках, я не буду его переформатировать, и мне придется управлять им как текстомтолько.Поэтому я думаю, что не могу использовать валидатор в моем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...