【问题标题】:Yii upload a file using a modelYii 使用模型上传文件
【发布时间】:2013-11-04 15:42:58
【问题描述】:

我只是尝试使用模型上传文件。我在当前情况下收到异常消息(请参阅下面的模型/控制器/视图):

CException
MyFile and its behaviors do not have a method or closure named "save". 

如果我的模型扩展了 CActiveRecord 而不是 CFormModel,则存在另一个异常:

CDbException
The table "MyFile" for active record class "MyFile" cannot be found in the database. 

我的错误是什么?这些是文件:

模型:MyFile.php

class MyFile extends CFormModel {
    public $image;
    public function rules () {
        return array (
            array ('image', 'file', 'types' => 'gif, jpg, png'),
        );
    }
}

控制器:MyFileController.php

class MyFileController extends CController {
    public function actionCreate() {
        $model = new MyFile;

        if(isset($_POST['MyFile'])) {

            $model->attributes=$_POST['MyFile'];
            $model->image=CUploadedFile::getInstance($model,'image');
            if($model->save()) {
                $path = Yii::app()->runtimePath.'/temp/uploadDirectory/'.$model->image;
                $model->image->saveAs($path);
            }
        }
        $this->render('create', array('model'=>$model));
    }
}

查看:create.php

 <h1>File-Upload</h1>

 <?php

    echo CHtml::form('','post',array('enctype'=>'multipart/form-data'));
    echo CHtml::activeFileField($model, 'image');
    echo CHtml::submitButton('abschicken', array('name' => 'submit'));
    echo CHtml::endForm();

 ?>

【问题讨论】:

    标签: php yii


    【解决方案1】:

    CFormModel 没有名为save() 的方法,如果你想调用它,你必须实现它,但你想要的是使用validate 方法

    如果MyFile 没有相关的数据库表,那么它不应该扩展CActiveRecord

    您可以通过调用validate() 来验证上传的图片是 gif、png 还是 jpg:

    class MyFileController extends CController {
        public function actionCreate() {
            $model = new MyFile;
    
            if(isset($_POST['MyFile'])) {
    
                $model->attributes=$_POST['MyFile'];
                $model->image=CUploadedFile::getInstance($model,'image');
                if($model->validate()) {
                    //The image is valid, you can save it
                    $path = Yii::app()->runtimePath.'/temp/uploadDirectory/'.$model->image;
                    $model->image->saveAs($path);
                }
                $this->render('create', array('model'=>$model));
            }
        }
    }
    

    【讨论】:

    • 现在我有一张桌子,我正在使用 CActiveRecord。现在我有另一个例外:缺少存储上传文件“xyz.jpg”的临时文件夹。
    • 哼文件夹Yii::app()-&gt;runtimePath.'/temp/uploadDirectory/' 存在吗?如果不是,那么您应该在保存图像之前使用mkdir($yourPath, 0775, true) 之类的东西创建它(true 是递归创建文件夹)
    • 是的,目录存在,同样的错误信息。。我想,我必须在设置的某个地方设置临时目录,但我目前不知道,在哪里?
    • 我找到了:在测试服务器上,“upload_tmp_dir”的 php.ini 文件中没有条目。我已将其更改为 /var/tmp
    【解决方案2】:
      public function actionCreate() {
        $model = new Item;
        if (isset($_POST['Item'])) {
            $model->attributes = $_POST['Item'];
            $model->images = CUploadedFile::getInstance($model, 'images');
            if ($model->save()) {
                $path = Yii::app()->basePath . '/../uploads/' . $model->images;
                $model->images->saveAs($path);
                // redirect to success page
            }
        }
        $this->render('upload', array('model' => $model));
    }
    

    【讨论】:

      【解决方案3】:
         $img = CUploadedFile::getInstance($model,'file');
              $randomNAme = hash('sha512',$model->file);
      
              $path = Yii::app()->basePath.'/'.'uploads/'.$img;
              $img->saveAs($path);
      

      【讨论】:

      • 用这个来存储使用 Yii 1 上传的文件
      猜你喜欢
      • 1970-01-01
      • 2012-07-30
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多