2011年12月8日

Yii Framework: 画像アップロードアクションを作る

( 2013-10-07 に更新しました )

Yii (v1.1.14) で画像アップロードのコードを書いてみます。サンプル用のテーブルとして以下を作ってみました。

CREATE TABLE `item` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL COMMENT 'タイトル',
  `file_name` varchar(255) NOT NULL COMMENT 'ファイル名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

画像は images/item/ に保存し、file_name カラムにはファイル名を保存する形をとります。とりあえず最初に Gii の Model Generator で Item モデルを、Controller Generator で item のコントローラ、ビューを作成しておきます。

モデル: const で "jpg, png, gif" という文字列を定義しておきます (数カ所で使うのでここで定義しておきました) 。 モデルで public なプロパティ $image の追加も。 rules() ではファイルアップロードに関するバリデーションがちょっと複雑ですが、これは CFileValidator に詳しく載っています。 拡張子が jpg, png, gif のみを許可し、MIME タイプもそれらに関連するもののみ許可、ファイルサイズは 1MB 。 更新時には画像を変更してもしなくてもいいように 'allowEmpty'=>true を update シナリオでは付加しています。

ちなみに mimeTypes は finfo 系の関数がなけれが 非推奨の mime_content_type を使ったりするので、セキュリティのことを考えると PHP 5.3.0 以降を使うのが無難だと思います。

コントローラ: init() でアップロードしたファイルの URL とパスを初期化しています。 CUploadedFile::getInstance() でアップロードされたファイルの情報を取得して、 saveAs() で任意の場所に保存する、という流れです ( 詳しくは CUploadedFile ) 。

ビュー: ビューは CHtml::form() で enctype ... を指定するくらいです。

参考リンク

0 件のコメント:

コメントを投稿