在Laravel中验证xml mime类型

cs7cruho  于 2022-12-14  发布在  其他
关注(0)|答案(3)|浏览(224)

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

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

但是当我上传文件时,这个验证器会触发一个错误“File must e of type application/xml,xml”,即使我删除了一个扩展名为.xml的真实的XML文件。
我在我的php.ini配置扩展=php_fileinfo.dll当然

dgsult0t

dgsult0t1#

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

**哑剧:*foo,酒吧 ,...

要验证的文件必须具有与列出的扩展名之一对应的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的图像文件通过了验证
请参阅使用闭包进行自定义验证

8cdiaqws

8cdiaqws2#

外部公司提供的XML似乎没有遵守适当的XML标准。
由于它不在我的手上,我不会重新格式化它,我将不得不管理它作为文本。所以我想我不能使用验证器在我的情况。

yi0zb3m4

yi0zb3m43#

对于那些试图在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()) {
.....

现在,guesser检查Prior* 类中的数组,然后转到原始数组。

相关问题