1

アプリケーション内で複数ファイルのアップロードを実装しようとしています。この記事を参照して、この例 を試してみましたが、うまくいきます (基本的には同じです)。しかし、何らかの理由でアプリ内に実装しようとすると、データがデータベース テーブルに保存されません。

ここでも同様の投稿をチェックしましたが、役に立たなかったことに注意してください。

そのため、ファイルをフォルダーにアップロードするとき (これで問題ありません)、ファイル名とセッション ID をテーブルに保存する必要があります。ここに私のテーブルがあります:

CREATE TABLE IF NOT EXISTS `photos` (
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `filename` varchar(45) NOT NULL,
  `amount` int(11) DEFAULT NULL,
  `pic_size_id` int(11) DEFAULT NULL,
  `users_sid` varchar(40) NOT NULL
  PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

これが私の_form.phpファイルです:

<div class="form">

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

<?php echo $form->errorSummary($model); ?>

<?php
$this->widget('CMultiFileUpload', array(
'name'=> 'images', 
'accept' => 'jpeg|jpg|gif|png', 
'duplicate' => 'Duplicate file!', 
'denied'=> 'Invalid file type', 
));
?>

<div class="row buttons">
    <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
</div>  

<?php  $this->endWidget(); ?>

</div><!-- form -->

そして、actionCreate()これが PhotosController 内の私のものです:

 public function actionCreate()
    {
            $model=new Photos;

            $images = array();
            $images = CUploadedFile::getInstancesByName('images');

                if (isset($images) && count($images) > 0) 
                {
                    // go through each uploaded image
                    foreach ($images as $image => $pic) 
                    {
                        if ($pic->saveAs(Yii::getPathOfAlias('webroot').'/upload/'.$pic->name)) 
                        {                              
                            $img_add = new Photos();
                            $img_add->filename = $pic->name; //it might be $img_add->name for you, filename is just what I chose to call it in my model
                            $img_add->users_sid = Yii::app()->session->sessionID; // this links your picture model to the main model (like your user, or profile model)
                            if(!$img_add->save()) // save your imagesDONE
                            {
                                var_dump($img_add->getErrors());
                                var_dump($pic->name);                                    
                            }                                
                        }
                    }                 
                }             

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

var_dump($img_add->getErrors())otuput は次のとおりです: array(1) { ["filename"]=> array(1) { [0]=> string(25) "ファイル名を空白にすることはできません。" } }

var_dump($pic->name)otuput は: string(37) "windows_metro-wallpaper-1920x1080.jpg" なので$pic->name、ファイル名が含まれています。

そして、同じ例で機能するのに、なぜ何も追加しないのか本当にわかりません。

また、単一のアップロードがある場合にも機能しますが、わずかに異なりactionCreate()_form.phpもちろん:

PhotosController.php:

public function actionCreate()
    {
        $model=new Photos;
        if(isset($_POST['Photos']))
        {
            $model->attributes=$_POST['Photos'];
                        $model->filename=CUploadedFile::getInstance($model,'filename');
            if($model->validate())
                        {
                            $model->filename->saveAs(Yii::getPathOfAlias('webroot').'/upload/'.$model->filename);

                            $photo = new Photos;
                            $photo->filename = $model->filename;
                            $photo->users_sid = Yii::app()->session->sessionID;
                            if($photo->save())
                            {
                                $this->redirect(array('view','id'=>$model->id));
                            }
                        }           
        }
        $this->render('create',array(
            'model'=>$model,
        ));
    }

_form.php:

 <div class="form">

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

    <?php echo $form->errorSummary($model); ?>

    <!--<div class="row">
        <?php echo $form->labelEx($model,'filename'); ?>
        <?php echo $form->fileField($model,'filename'); ?>
        <?php echo $form->error($model,'filename'); ?>
    </div> -->

<div class="row buttons">
    <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
</div>  

<?php  $this->endWidget(); ?>

</div><!-- form -->
4

1 に答える 1

0

a) 各 $pic が null でないかどうかを確認します。(私のコードを見てください)

b) テスト用に、photo-model-rules で filename-attribute を安全なものとして設定します

if (isset($images) && count($images) > 0) 
{
    // go through each uploaded image
    foreach ($images as $image => $pic) 
    {
        if(!$pic || !$pic->getName()) {
            echo "pic is empty";
            continue;
        }

        if ($pic && $pic->saveAs(Yii::getPathOfAlias('webroot').'/upload/'.$pic->name)) 
                {

            // code goes here 

        }
    }       
于 2015-07-09T19:45:48.633 に答える