1

私は yii が初めてで、ファイルのアップロードに問題があります。ファイルをアップロードすると、検証されません-すべてのタイプが許可されます(許可されるべきではありません)、空が許可されます(許可されるべきではありません)などです。もちろん、モデルに適切なルール(と思います)を含めました。何らかの理由で fileField が検証されていないようです。

[送信] ボタンをクリックしたときに、エラー メッセージ (間違った型または空) を書き込みたい。おかしなところが見つからない場合は、ぜひご覧ください。

ここに私のフォームがあります:

<?php class UploadSolutionForm extends CFormModel
    {

public $sourceCode;

public function rules()
{
    return array(
        array('sourceCode', 'file', 'types'=>'java, zip', 'allowEmpty'=>false, 'wrongType'=>'Only .java and .zip files.'),
    );
}

/**
 * Declares attribute labels.
 */
public function attributeLabels()
{
    return array(
            'sourceCode' => 'Source code',
    );
}}

コントローラーでの私のアクションは次のとおりです。

public function actionSolveProblem()
{
    //gets id from url
    $id = Yii::app()->request->getQuery('id');

    //guests can't work with problems in any way
    if (Yii::app()->user->isGuest)
    {
        $this->redirect(array('site/index'));
        return;
    }

    if(isset($id))
    {
        $model = new UploadSolutionForm();

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

            $newFile = CUploadedFile::getInstance($model, 'sourceCode');

            $problem = Problems::model()->findByAttributes(array('id'=>$id));

            $version = Solutions::model()->countByAttributes(array('id_problem'=>$id))+1;

            $pathUser = Yii::app()->basePath.'\\SubjectFolder\\'.$problem->id_subject.'\\'.$id.'\\'.Yii::app()->user->getName();

            $path = $pathUser.'\\'.$version;

            if (!is_dir($pathUser)) {
                mkdir($pathUser);
            }
            if (!is_dir($path)) {
                mkdir($path);
            }

            $uploadPath = $path.'\\'.$newFile->name;

            $solution = new Solutions();
            $solution->id_problem = $id;
            $solution->id_user = Yii::app()->user->getId();
            $solution->submit_time = date("Y-m-d H:i:s",time());
            $solution->path_to_file = $uploadPath;
            $solution->version = $version;

            if($newFile->saveAs($uploadPath))
            {
                if($solution->save())
                {
                    Yii::app()->user->setFlash('new_problem','Solution uploaded');
                    $this->redirect(array('site/problems'));
                }
                else
                {
                    Yii::app()->user->setFlash('new_problem','Error! Could not save into db');
                    $this->redirect(array('site/problems'));
                }

            }
        }

        //part bellow is not really important in this case

        $auth = Problems::model()->with(array('subject','subject.currentUserSubject' => array('alias'=>'currentUserSubject')))->findByAttributes(array('id'=>$id));

        // user with proper role cannot upload solutions to problems
        if($auth!=null)
        {
            $this->render('solve',array('model'=>$model));
        }
        else
        {
            Yii::app()->user->setFlash('new_problem','You are not authorized to upload a solution for this problem');
            $this->redirect(array('site/problems'));
        }

    }


}

そして、これが私の見解です(solve.php):

<?php 
$form = $this->beginWidget(
        'CActiveForm',
        array(
                'id' => 'upload-form',
                'htmlOptions' => array('enctype' => 'multipart/form-data'),
                'enableClientValidation'=>true,
                'clientOptions'=>array(
                        'validateOnSubmit'=>true,
                        ),));
                ?>

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

</div>

<div class="row buttons">
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php 
// ...
$this->endWidget();?>

いろいろ調べたのですが、何も問題がないように見えるので、誰かが助けてくれることを願っています。

編集: 私は主に、クライアント側の検証がファイルのアップロードで正しく機能しない理由を理解したい (テキスト フィールドで機能する) と、もちろんそれを修正したい...

4

1 に答える 1

0

マイケルがコメントで言っているように、主な問題は、アップロード ファイルをモデルのファイル属性に明確に割り当てていないことです。Yii ファイルの検証は、デフォルトで unsafe に設定されています (その結果、一括割り当て不可)。

その結果、アップロードされたファイルが検証ルールによって処理されることはありません。

于 2013-07-27T15:16:19.153 に答える