Yii2 如何为新的扩展类型修改文件验证器?

Yii2 How to modify file validator for new extension type?

我有扩展名为 .edoc 的文件,mimetype 是 application/zip。当我尝试上传具有此扩展名的文件时,文件验证器给我一个标准错误 - 只有给定的(规则中的)扩展名才能上传。这是我的规则:

return array_merge($parent_rules,[
            [
                ['file'],
                'file',
                'maxSize' => 5242880,  // limit 5mb => 5(mb) * 1024(kb) * 1024(b)

                'extensions' => ['pdf','doc','docx','xls','xlsx','png','jpeg','jpg','gif','tiff','tif','avi','flv',
                'wmv','mov','mp4','mkv','ogg','xml','zip','rar','7z','ods','odt','txt','edoc','msg'],
            ],
        ]);

我发现在 vendor\yiisoft\yii2\helpers\mimeTypes.php 中有一组规则没有描述扩展名“.edoc”。当我添加键=>值对

'edoc' => 'application/zip'

正在上传文件。

How/is是否可以在不修改供应商文件的情况下修改或添加此规则?

yii\validators\FileValidator 使用 yii\helpers\FileHelper 获取 mime 类型的扩展名列表。您可以告诉 FileHelper 使用不同的文件作为 mime 魔法文件。

准备你自己的魔法文件,它可以像这样看:

<?php
// load mime types from original magic file
$originalMagicFile = Yii::getAlias('@yii/helpers/mimeTypes.php');
$mimeTypes = require $originalMagicFile;

$mimeTypes['edoc'] => 'application/zip';
return $mimeTypes;

然后你需要告诉文件助手使用你的魔法文件而不是原来的文件。为此,您需要设置 yii\helpers\FileHelper::$mimeMagicFile static 属性。最好在请求事件处理程序之前执行此操作。那是应用程序已经初始化的时候(所以你可以使用别名)但是请求还没有被处理。

因此,在您的配置中添加如下内容:

$config = [
    // ... other app configurations ...

    'on beforeRequest' => function () {
        \yii\helpers\FileHelper::$mimeMagicFile = '/path/to/your/magicFile.php';
        // you can even use aliases, for example:
        //\yii\helpers\FileHelper::$mimeMagicFile = '@app/components/mimeTypes.php';
    }

];

试试这个

        return array_merge($parent_rules, [
            [
                ['file'],
                'file',
                'maxSize' => 5242880,  // limit 5mb => 5(mb) * 1024(kb) * 1024(b),
                'checkExtensionByMimeType' => false,
                'mimeTypes' => ['application/zip'],
                'extensions' => ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'png', 'jpeg', 'jpg', 'gif', 'tiff', 'tif', 'avi', 'flv',
                    'wmv', 'mov', 'mp4', 'mkv', 'ogg', 'xml', 'zip', 'rar', '7z', 'ods', 'odt', 'txt', 'edoc', 'msg'],
            ],
        ]);