在Yii中验证并保存上传的ajax图像

时间:2014-07-28 16:09:01

标签: php ajax validation file-upload yii

我需要通过ajax请求将图像发送到服务器,它完成得很好 在我的控制器中,我可以使用$_FILES["image"]来做它的东西 但是我需要在保存之前验证图像 在Yii中,这可以通过做这样的事来实现

$file = CUploadedFile::getInstance($model,'image');
if($model->validated(array('image'))){
    $model->image->saveAs(Yii::getPathOfAlias('webroot') . '/upload/user_thumb/' . $model->username.'.'.$model->photo->extensionName);
}

但问题是我没有$model,我所拥有的只是$_FILES["image"],现在应该放什么而不是$model ??? 有没有其他方法可以验证和保存文件而无需创建模型,只需使用$_FILES["image"]
感谢这个令人敬畏的社区...... :)

2 个答案:

答案 0 :(得分:1)

您可以通过多种方式进行上传。我想向你提供其中一个。

1.您需要为图像创建模型。

class Image extends CActiveRecord {

    //method where need to specify validation rules
    public function rules()
    {
        return [
            ['filename', 'length', 'max' => 40],
            //other rules
        ];
    }

    //this function allow to upload file
    public function doUpload($insName)
    {
        $file = CUploadedFile::getInstanceByName($insName);
        if ($file) {
            $file->saveAs(Yii::getPathOfAlias('webroot').'/upload/user_thumb/'.$this->filename.$file->getExtensionName());
        } else {
            $this->addError('Please, select at least one file'); // for example
        }
    }   
}

2.现在,需要创建控制器,您将在其中执行所有操作。

class ImageController extends CController {

    public function actionUpload()
    {
        $model = new Image();
        if (Yii::app()->request->getPost('upload')) {
            $model->filename = 'set filename';
            $insName = 'image'; //if you try to upload from $_FILES['image']
            if ($model->validate() && $model->doUpload($insName)) {
                //upload is successful
            } else {
                //do something with errors
                $errors = $model->getErrors();
            }
        }
    }    
}

答案 1 :(得分:1)

在某些情况下,创建模型可能有点过分。

$ _FILE超变量是HTTP机制的一部分。

您可以使用本机PHP函数move_uploaded_file()

来处理副本
   $fileName = "/uploads/".myimage.jpg";
   unlink($fileName);
   move_uploaded_file($_FILES['Filedata']['tmp_name'], $fileName);

但是,您失去了使用提供附加功能和检查的库(例如文件类型和文件大小限制)的细节。