验证Laravel中的XML MIME类型

时间:2019-09-24 14:32:45

标签: laravel laravel-5

我设置了一个验证器,以检查我们上传的文档是否为XML文件

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

但是,当我上传时,即使我删除扩展名为.xml的真实XML文件,此验证器也会触发错误“文件必须为application / xml,xml类型”。

我当然在我的php.ini配置扩展名= php_fileinfo.dll中

3 个答案:

答案 0 :(得分:1)

请注意,mime类型验证会指示Laravel读取文件内容以确定其类型,因此将图像扩展名从.jpg更改为.xml不会欺骗

Docs

哑剧: 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

因此请确保您的文件是Laravel项目中的实际有效xml文件(使用phpunit.xml进行尝试)

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的图像文件通过了验证

请参见using closures for custom validation

答案 1 :(得分:0)

外部公司提供的XML似乎不符合适当的XML标准。

由于它不在我手上,因此我不会重新格式化它,而只能将其作为文本进行管理。所以我想我不能在我的情况下使用验证器。

答案 2 :(得分:0)

对于那些试图在Laravel 5上传递xml扩展名的人(像我一样)。 这也可以与其他扩展一起使用。

由于Laravel ExtensionGuesser允许通过方法寄存器添加自定义猜测器,因此我们进行以下操作。

  1. 使用自己的扩展数组创建新类。我已经扩展了原来的接口,因此它对应了接口。我把它放到Helpers文件夹中。
<?php

namespace App\Helpers;

use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeExtensionGuesser;

/**
 * Provides a best-guess mapping of mime type to file extension.
 */
class PriorExtensionGuesser extends MimeTypeExtensionGuesser
{
    /**
     * Addition to pretty old map of mime types and their default extensions.
     *
     * @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
     */
    protected $defaultExtensions = array(
        'text/xml' => 'xml',
    );

}
  1. 在您的控制器中(不要忘记使用语句):
use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;

public function store (Request $request) {

        if ($request->hasFile('file')) {

            $guesser = ExtensionGuesser::getInstance(); //take the guesser who will guess
            $guesser->register(new \App\Helpers\PriorExtensionGuesser()); //add own guesser

            $validator = Validator::make($request->all(), [

                'file' => 'file|mimes:txt,xls,xlsx,csv,xml|max:32768',

            ]);

            if ($validator->fails()) {
.....

因此,现在猜测者检查Prior *类中的数组,然后返回原始数组。