【发布时间】:2021-12-22 22:21:16
【问题描述】:
这是我的输入文件“图像”的验证:
public function validationDefault(Validator $validator): Validator
{
$validator = parent::validationDefault($validator);
$validator
->allowEmptyFile('image')
->add('image', 'uploadError', [
'rule' => function ($value, $context) {
foreach ($value as $v) {
return Validation::uploadError($v, true);
}
},
'last' => true,
'message' => 'Upload error'
])
->add('image', 'mimeType', [
'rule' => function ($value, $context) {
foreach ($value as $v) {
return Validation::mimeType($v, [
'image/png',
'image/gif',
'image/pjpeg',
'image/jpeg'
]);
}
},
'message' => 'Bad mime type.',
]);
}
提交文件时效果很好,但是当没有文件上传时触发mimeType验证错误。
所以我修改了 mimeType 规则,以在检查 mimeType 之前检查文件是否已上传:
public function validationDefault(Validator $validator): Validator
{
$validator = parent::validationDefault($validator);
$validator
->allowEmptyFile('image')
->add('image', 'uploadError', [
'rule' => function ($value, $context) {
foreach ($value as $v) {
return Validation::uploadError($v, true);
}
},
'last' => true,
'message' => 'Upload error'
])
->add('image', 'mimeType', [
'rule' => function ($value, $context) {
// Added to avoid mimeType validation when no file is uploaded
if ($value[0]->getError() === UPLOAD_ERR_NO_FILE) {
return true;
}
foreach ($value as $v) {
return Validation::mimeType($v, [
'image/png',
'image/gif',
'image/pjpeg',
'image/jpeg'
]);
}
},
'message' => 'Bad mime type.',
]);
}
它有效,但对我来说添加起来似乎不太干净
if ($value[0]->getError() === UPLOAD_ERR_NO_FILE) {return true;}
在 mime 类型检查之后可以添加的每条规则(例如,我将添加文件大小检查、图像宽度检查等)
有没有更好的方法在提交文件时才在文件上添加验证规则?
【问题讨论】:
-
为什么值是一个数组?单次上传不应该是这种情况。如果你有一个多上传字段,那么验证就会出错。
-
该值是一个数组,因为我已将输入设置为:
echo $this->Form->control('image', ['type' => 'file', 'name' => 'image[]']);。我正在创建一个用于文件管理的插件,其附件行为使用 hasMany 关联链接文件。与其根据多上传文件管理 hasOne 和 hasMany 关联,我认为如果我只管理 hasMany 关联,即使是单个上传文件,我的代码也会更清晰。 -
@ndm 确实,当 $value 不是数组时,我不需要添加
if ($value[0]->getError() === UPLOAD_ERR_NO_FILE) {return true;}。但是多上传输入文件呢?如何验证? -
这不是我想要建议的,事实上,我此时并没有提出任何建议的意思,我只是想知道您的设置,因为您的问题的可能解决方案可能取决于它,并且因为验证看起来是错误的,因为它只检查数组中的第一个条目,这可能意味着对于多文件输入,未验证的文件可能会漏掉。
-
@ndm 在多上传输入的情况下,该值是一个数组。无论如何
$value总是至少有一个条目:如果没有上传文件$value有一个条目[0]UPLOAD_ERR_NO_FILE有错误,如果有一个或多个文件上传了第一个条目(文件)可以'UPLOAD_ERR_NO_FILE上没有错误。但是在我添加到字段中的每个验证规则中检查if ($value[0]->getError() === UPLOAD_ERR_NO_FILE) {return true;}对我来说似乎很难看。
标签: php file validation cakephp-4.x