1

CMultiFileUpload と CUploadedFile を使用して複数ファイルのアップロードを実装しようとしていますが、うまくいきません。具体的には、ビューのオプションで 'enctype' => 'multipart/form-data' を使用していることを考慮しても、_POST が機能していません。

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'examen-form',
    'enableAjaxValidation'=>false,
    'htmlOptions' => array('enctype' => 'multipart/form-data'),

)); ?>

これは、CMultiFileUpload に使用されるウィジェットとパラメーターです。

        <div class="row">
            <?php echo $form->labelEx($model,'archivo_foto')?>
            <?php //echo CHtml::activeFileField($model,'archivo_foto')?>

            <?php $this->widget('CMultiFileUpload', array(
                    'model' => $model,
                    'name' => 'archivo_foto',
                    'accept' => 'jpeg|jpg|gif|png|txt', // useful for verifying files
                    'duplicate' => 'Duplicate file!', // useful, i think
                    'denied' => 'Invalid file type', // useful, i think
                    'max' => 10,
                    'htmlOptions' => array( 'multiple' => 'multiple', 'size' => 25 ),
            )); ?>

            <?php echo $form->error($model,'archivo_foto')?>
    </div>

一方、コントローラ アクションは次のように実装されます。

        public function actionUpdateam($id)
    {
            $model=$this->loadModel($id);
            $dir=Yii::getPathOfAlias('application.uploads');
            $model->archivo_documento='funciona 0';
            if(isset($_POST['Examen'])) {

                    $model->attributes=$_POST['Examen'];

                    // THIS is how you capture those uploaded images: remember that in your CMultiFile widget, you set 'name' => 'archivo_foto'
                    $images = CUploadedFile::getInstancesByName('archivo_foto');

                    // proceed if the images have been set
                    $model->archivo_documento='funciona uno';
                    if (isset($images) && count($images) > 0) {
                            $model->archivo_documento='funciona dos';
                            // go through each uploaded image
                            foreach ($images as $image) {
                                    echo $image->name.'<br />';
                                    $image->saveAs($dir.'/'.$image->name);
                                    $model->archivo_foto = $model->archivo_foto."+".$image->name;
                            }

                            // save the rest of your information from the form
                            if ($model->save()) {
                                    $this->redirect(array('view','id'=>$model->id));
                            }
                    }

            }

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

最後に、モデルに使用されているルールについて言及することが重要だと思います (それが問題の原因でもある可能性があります)。

array('archivo_foto','file','allowEmpty'=>true,'maxFiles'=>10),

コントローラーがファイルをアップロードしておらず、データベースに変更を加えていないため、問題は post メソッドにあると思います。確信はないけど。

4

3 に答える 3

0

私は同じ拡張子を使用していますが、これらのコードを使用して動作しています ビューファイル

<?php $form = $this->beginWidget('CActiveForm', array(
'id'=>'adpost-form',
'enableClientValidation'=>true,
'clientOptions' => array(
     'validateOnSubmit'=>true,
     'validateOnChange'=>false,
     'afterValidate'=>'js:submiAjaxForm'
 ),
'htmlOptions' => array('enctype' => 'multipart/form-data'),

)); ?>

<?php
                $this->widget('CMultiFileUpload', array(
                    'name' => 'photo_name',
                    'accept' => 'jpeg|jpg|gif|png',
                    'duplicate' => 'File is not existed!',
                    'denied' => 'Not images', // useful,
                    'htmlOptions' => array(
                        'style' =>'color: transparent;',
                    ),
                ));
                ?>

そしてコントローラで

$images = CUploadedFile::getInstancesByName('photo_name');
foreach ($images as $image => $pic) {

                        //----------------- Renaming image before uploading

                        $extension      =   $pic->getExtensionName();
                        $newName    =   "image_".$adModel->id;
                        $newName                .=  "_".$imgCount.".".$extension;
                        $imgCount++;

                        if ($pic->saveAs($newPath.$newName)) {
                            // add it to the main model now
                            $img_add             = new AdsPhotosTbl;
                            $img_add->photo_name = $newName;
                            $img_add->ad_id      = $adModel->id;   
                            $img_add->status     = 1;
                            if(!$img_add->save()){
                                $error           =   true;
                                $upload_error    =   true;
                                break;
                            } 
                        }else{
                            $upload_error       =   true;
                            $error              =   true;
                            break;
                        }
                    }
于 2014-10-10T10:18:10.750 に答える
0

フォームに次のコードを追加します

'htmlOptions' => array(
            'enctype' => 'multipart/form-data',
        ),

お気に入り

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'form',
    // Please note: When you enable ajax validation, make sure the corresponding
    // controller action is handling ajax validation correctly.
    // There is a call to performAjaxValidation() commented in generated controller code.
    // See class documentation of CActiveForm for details on this.
    'enableAjaxValidation'=>true,

     'htmlOptions' => array(
        'enctype' => 'multipart/form-data',
    ),
)); ?>
于 2014-02-18T13:29:56.193 に答える