【问题标题】:Yii PHP file uploader overwriting on updateYii PHP 文件上传器在更新时覆盖
【发布时间】:2016-03-18 13:59:38
【问题描述】:

我在 PHP 框架 Yii 中有一个基本表单,创建操作可以正常工作,但是,当我更新记录时(例如,如果我没有更改文件上传,而是另一个字段),它会覆盖文件上传并将其空白,任何人都可以帮助我吗?我已经尝试了所有我能想到的关于控制器项目的验证,但无论我添加什么,它在更新时仍然是空白的。

这是查看代码

<?php $form=$this->beginWidget('booster.widgets.TbActiveForm', array(
    'id'=>'company-form',
    'enableAjaxValidation'=>false,
        'method' => 'post',
        'type' => 'horizontal',
        'htmlOptions' => array(
            'enctype' => 'multipart/form-data'
        )
)); 

echo $form->textFieldGroup($model,'name',array('class'=>'col-md-5','maxlength'=>75));

echo $form->fileFieldGroup($model, 'logo',
                array(
                    'wrapperHtmlOptions' => array(
                            'class' => 'col-md-9',
                    ),
                    'hint' => 'You can only upload jpg, png, gif\'s – max upload filesize is 1.5mb. Square images are advised.<br/>In certain browsers, you can also drag \' drop files into the dropzone.',
                )
        );
         if($model->isNewRecord!='1'){ ?>
        <div class="row">
            <label class="col-md-3 control-label" style="padding-top: 25px;">Company image</label>
            <div class="col-md-6">
                <?php echo CHtml::image(Yii::app()->request->baseUrl.'/images/portraits/company/'.$model->logo,"logo",array("class"=>"img-polaroid placeholder")); ?>
            </div>
        </div>
         <?php } ?>

这是我在 Controller 中的 actionUpdate 函数

public function actionUpdate($id)
    {
        $model=$this->loadModel($id);

        if(isset($_POST['Company']))
        {
            $model->attributes=$_POST['Company'];

                        $uploadedFile=CUploadedFile::getInstance($model,'logo');
                        if (is_object($uploadedFile) && get_class($uploadedFile)==='CUploadedFile'){
                            if(!$uploadedFile == null){
                                $rnd = rand(0,9999);

                                $filename_preg1 = preg_replace("/[^a-zA-Z0-9.]/", '', "{$uploadedFile}");
                                $fileName = "{$rnd}-{$filename_preg1}";  
                                $company = $model->name;
                                $model->logo = $fileName;
                            }

                            if($model->save()){
                                if(!empty($uploadedFile)){
                                    $fullPath = Yii::app()->basePath . '/../images/portraits/company/' . $fileName;
                                    $uploadedFile->saveAs($fullPath);
                                }
                                    $this->redirect(array('view','id'=>$model->company_id));
                            }
                        }
                        if($model->save()){
                            $this->redirect(array('view','id'=>$model->company_id));
                        }
        }

        $this->render('update',array(
            'model'=>$model,
        ));
    }

谁能看出我哪里出错了?

更新

感谢 SiZE,您给我的代码在一种形式中有效,而在另一种形式中无效,在模型规则中没有验证的那一种形式

array('logo', 'file','types'=>'jpg, gif, png', 'allowEmpty'=>true, 'on'=>'update'),

这仅适用于此处的 allowEmpty 参数,因为它不是必填字段,但是,随着模型中的规则到位,无论如何它仍然会使文件字段为空,有人还有什么想法吗?

【问题讨论】:

    标签: php file-upload yii


    【解决方案1】:

    CActiveForm 调用 CHtml::activeFileField 方法生成空隐藏字段以正确使用模型的规则。

    你可以试试这个:

    $model=$this->loadModel($id);
    $original_logo = $model->logo;
    if(isset($_POST['Company'])) {
        $model->attributes = $_POST['Company'];
        $logo = CUploadedFile::getInstance($model, 'logo');
        $model->logo = $logo !== null ? $logo->getName() : $original_logo;
        if ($model->save()) {
            if ($logo !== null) {
                $logo->saveAs(/* specify path with file name here */);
            }
            $this->redirect(array('view','id'=>$model->company_id));
        }
    }
    

    【讨论】:

    • 感谢您的回答 SiZE,似乎效果很好,再次感谢
    猜你喜欢
    • 2023-03-17
    • 2012-12-06
    • 2011-12-25
    • 2014-08-29
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多