這是我的輸入檔案“影像”的驗證:
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 型別檢查后添加的每條規則似乎并不那么干凈
(例如,我將添加檔案大小檢查、影像寬度檢查等)
是否有更好的方法僅在提交檔案時在檔案上添加驗證規則?
uj5u.com熱心網友回復:
查看您的上傳功能當前的結構,即所有上傳都存盤在同一個表中,并且行為通過hasMany關聯處理它們,包括僅接受單個檔案的模型和使用多檔案輸入的前端,一種可能的解決方案是在上傳空檔案的情況下簡單地洗掉該欄位。
您可以通過Model.beforeMarshal事件/回呼更改資料,它將在創建/修補物體時運行,在應用驗證之前,例如:
public function beforeMarshal(
\Cake\Event\EventInterface $event,
\ArrayAccess $data,
\ArrayObject $options
): void {
if (
isset($data['image'][0]) &&
$data['image'][0] instanceof \Psr\Http\Message\UploadedFileInterface &&
$data['image'][0]->getError() === \UPLOAD_ERR_NO_FILE
) {
unset($data['image']);
}
}
image如果它是一個陣列,這將洗掉該欄位,并且第一個元素是一個空的上傳檔案物件。對于未選擇任何檔案的多檔案輸入以及使用陣列作為名稱的單檔案輸入,您會收到此資訊。
您的驗證規則將在現場不存在再后來干脆不跑,他們在做跑,他們不會有允許這種情況下,反而能嚴格要求有效的上傳檔案的物件。
因此,例如對于應該只接受一次上傳的模型,您可以執行以下操作以確保該值是一個陣列,該陣列僅包含一個帶有上傳檔案物件的元素:
$validator
->add('image', 'exactlyOneUploadedFile', [
'rule' => function ($value, $context) {
if (
is_array($value) &&
count($value) === 1 &&
$value[0] instanceof \Psr\Http\Message\UploadedFileInterface
) {
return true;
}
return false;
},
// ...
])
// ...
同樣,對于應該接受多次上傳的模型,您可以執行以下操作以確保該值是一個陣列,其中包含僅上傳檔案物件的一個??或多個元素:
$validator
->add('image', 'onlyUploadedFiles', [
'rule' => function ($value, $context) {
if (
!is_array($value) ||
count($value) < 1
) {
return false;
}
foreach ($value as $upload) {
if (!($upload instanceof \Psr\Http\Message\UploadedFileInterface)) {
return false;
}
}
return true;
},
// ...
])
// ...
務必嚴格執行這些檢查,這一點很重要!例如,您發布的驗證規則將僅檢查陣列中的第一個條目,但不檢查是否存在更多元素,這可能會導致發送多個上傳的情況,并且附加上傳滑動通過未驗證!
也可以看看
- Cookbook > 資料庫訪問和 ORM > 保存資料 > 在構建物體之前修改請求資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/359054.html
標籤:php 文件 验证 cakephp-4.x
