yii2.0ファイルのアップロード



Yii 2.0は長い間出てきて、ずっと公式サイトを見ていましたが、実践したことがありません.今日は画像のアップロード操作をしました.
1単純なデータテーブルの作成
mysql> desc article;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| title   | varchar(60)  | NO   | MUL | NULL    |                |
| image   | varchar(100) | NO   |     | NULL    |                |
| content | text         | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

データテーブルの構造は簡単です:自増ID、文章タイトル、文章サムネイル、文章内容.
2 Giiを用いて1つの文章表のModelを生成し、もう1つのCURDを生成する.
giiは確かに使いやすいツールで、簡単で迅速で、具体的なチュートリアルは次のリンクアドレスを参照することができます.
住所:http://www.yiichina.com/guide/2/start-gii
3テンプレートファイルの変更
変更_form.php(テンプレートファイルの追加と変更共通)
<div class="article-form">

    <?php
        $form = ActiveForm::begin([
                    'id' => "article-form",
                    'enableAjaxValidation' => false,
                    'options' => ['enctype' => 'multipart/form-data'],
        ]);
    ?>

    <?= $form->field($model, 'title')->textInput(['maxlength' => 60]) ?>
    <?= $form->field($model, 'image')->fileInput() ?>
    <?= $form->field($model, 'content')->textarea(['rows' => 6]) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

 
上のコードでは、ActiveForm::begin()メソッドで作成されたoptionsオプションに注意してください.
参考書類は、yii 2basicvendoryiisoftyii 2widgetsActiveForm.phpは、開いてみればわかりますが、指定したオプションはクラスの静的プロパティです.
4コントローラの変更方法
    $model = new Article();
        $rootPath = "uploads/";
        if (isset($_POST['Article'])) {
            $model->attributes = $_POST['Article'];
            $image = UploadedFile::getInstance($model, 'image');
            $ext = $image->getExtension();
            $randName = time() . rand(1000, 9999) . "." . $ext;
            $path = abs(crc32($randName) % 500);
            $rootPath = $rootPath . $path . "/";
            if (!file_exists($path)) {
                mkdir($rootPath,true);
            }
            $image->saveAs($rootPath . $randName);
            $model->image = $rootPath.$randName;

            if ($model->save()) {
                return $this->redirect(['view', 'id' => $model->id]);
            }
        } else {
            return $this->render('create', [
                        'model' => $model,
            ]);
        }
    }

このアクションでは、まずUploadedFile::getInstance()を呼び出し、インスタンス化されたオブジェクトを返します.
getExtension()でファイル接尾辞名を取得し、ランダムに$randNameというファイル名を生成します.
次に、crc 32関数をマルチディレクトリストレージのために使用します.
最後にsaveAs()メソッドを直接呼び出してファイルを保存します.
これで大功を成し遂げた.
参考書類:yii 2basicvendoryiisoftyii 2webUploadedFile.php
ps:最後にYii 2.0はphpの新しいバージョンのネーミングスペースなどを使用しており、コントローラファイルのヘッダはuseの下でokであることを覚えています.