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'],
],
]);
我有扩展名为 .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'],
],
]);