【问题标题】:validating and save an uploaded ajax image in Yii在 Yii 中验证并保存上传的 ajax 图像
【发布时间】:2014-09-19 21:19:07
【问题描述】:

我需要通过 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"]
感谢这个很棒的社区... :)

【问题讨论】:

    标签: php ajax validation file-upload yii


    【解决方案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();
                }
            }
        }    
    }
    

    【讨论】:

    • 虽然这不是我想要的,但你确实向我展示了正确的方法,我找到了正确的方法,非常感谢:)
    【解决方案2】:

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

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

    您可以使用原生 PHP 函数 move_uploaded_file() 来处理副本

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

    但是,您会失去使用提供额外功能和检查(例如文件类型和文件大小限制)的库的好处。

    【讨论】:

    • 非常感谢,但正如你所说,我需要 Yii 验证的细节 :)
    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多