1

私は yii でファイルをアップロードし、それらのファイルを検証したいと考えています。ただし、ファイルの種類が異なる場合は、サイズが異なります。例 - ユーザーが jpg または pdf ファイルをアップロードしたい場合 - maxSize - 10 MB。- ビデオ ファイルの場合 - maxSize - 150 MB。

どうすればそうできますか?

2 番目のルールのみが機能するため、このバリアントは機能しません。

public function rules()
{
    return array(
        array('files', 'validateFiles', 'types' => 'jpg, gif, png, pdf, doc, docx', 'maxSize' => 10 * 1024 * 1024, 'on' => 'upload'),
        array('files', 'validateFiles', 'types' => 'avi, mpg, flv, mov, mpeg, mp4, 3gp, wmv', 'maxSize' => 150 * 1024 * 1024, 'on' => 'upload'),
}

public function validateFiles($attribute, $params)
{
    $validator = CValidator::createValidator('file', $this, $attribute, $params);
    $files = array();
    foreach(CUploadedFile::getInstances($this, $attribute) as $file) {
        $this->$attribute = $file;
        $files[] = $file;
        $validator->validate($this, $attribute);
    }
    $this->$attribute = $files;
}
4

3 に答える 3

1

あなたは最大を許可することができます。アップロードするファイルサイズ、およびファイルが受信されたときに検証します-モデルまたはコントローラーで検証します。とにかく、ファイルサイズはファイルがアップロードされた後にのみYiiでも検証されます。

于 2012-10-31T20:31:42.667 に答える
0

私の解決策-新しいバリデーターを作成します-たとえば、PictureVideoValidator で、このファイルでファイルタイプを選択して検証を行います。

<?php
class PictureVideoValidator extends CValidator
{
    public $allowEmpty = false;
    public $maxSizePicture = 4194304; // 4 Mb
    public $maxSizeVideo = 157286400; // 150 Mb

    protected function validateAttribute($object, $attribute)
    {
        $file = $object->$attribute;

        if (!$file instanceof CUploadedFile) {
            $file = CUploadedFile::getInstance($object, $attribute);
            if ($file == null)
                return $this->emptyAttribute($object, $attribute);
        }


        $type = CFileHelper::getMimeType($file->tempName);
        list($type, $subtype) = @explode('/', $type);

        $allowedTypes = array('image', 'video');

        if (!in_array($type, $allowedTypes)) {
            $message = Yii::t('ext', 'File cannot be uploaded because it is not a valid image/video file');
            $this->addError($object, $attribute, $message);
            return;
        }

        $fileSize = filesize($file->tempName);
        if ($type == 'image') {
            $maxSize = $this->maxSizePicture;
        } else if ($type == 'video') {
            $maxSize = $this->maxSizeVideo;
        }

        if ($fileSize > $maxSize) {
            $message = Yii::t('ext', 'The file "{fileName}" is too large. Its size cannot exceed {maxSize} bytes.');
            $this->addError($object, $attribute, $message, array(
                '{fileName}' => $file->getName(),
                '{maxSize}' => $this->maxSizePicture
            ));
        }
    }

    protected function emptyAttribute($object, $attribute)
    {
        if (!$this->allowEmpty) {
            $message = $this->message !== null ? $this->message : Yii::t('yii', '{attribute} cannot be blank.');
            $this->addError($object, $attribute, $message);
        }
    }

}

?>
于 2012-11-08T11:16:37.563 に答える
0

あなたのやり方ではうまくいきません。

コードが最初の配列に対して検証された場合、2 番目の配列に対しては失敗し、その逆も同様です。両方の条件が満たされない限り、モデルは検証されません。

これを実現する最善の方法は、validateFiles 関数を展開し、そこで拡張子/ファイルサイズを確認することです。

たとえば、最初に両方の組み合わせとしてルール機能を変更します

public function rules()
{
    return array(
        array('files', 'validateFiles', 'types' => 'jpg, gif, png, pdf, doc, docx, avi, mpg, flv, mov, mpeg, mp4, 3gp, wmv', 'maxSize' => 150 * 1024 * 1024, 'on' => 'upload')
    )
}

そうすれば、ファイル タイプのチェックはすでに完了しており、最大ファイル サイズの合計のチェックも完了しています。

その後、validateFiles関数を変更して拡張子/ファイルサイズを確認します

于 2012-10-31T14:12:37.060 に答える