2011年3月9日水曜日

kohana3.1.xでファイルのアップロード

kohana3.1.xで、ファイルのアップロードを作る機会があったので備忘録。

kohana3.0.x から 3.1.xの移行でバリデーション周りが変更になったので注意。


View (HTML)

<form action="/" method="post" accept-charset="utf-8" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Upload" />
</form>


Controller

public function action_upload()
 {
  
  if (isset($_FILES['file'])) {
   
   // バリデーションインスタンスを作成
   $validation = Validation::factory($_FILES);
   
   // バリデーションルールを設定
   $validation->rules('file',
    array(
     array('Upload::not_empty'), 
     array('Upload::valid'), 
     array('Upload::type', array(':value', array('jpg', 'png', 'gif'))), 
     array('Upload::size', array(':value', '2M')), 
    )
   );
   
   // チェックして
   if ($validation->check()){
    // アップロード
    $file_name = Upload::save($_FILES['file'] /*[, $filename, $directory, $chmod ]*/);
    
   } else {
    // エラー処理
    $validation->errors('error');
    
   }
  }
 }

message (error.php)

return array
(
 'file' => array(
  'Upload::not_empty' => 'ファイルが指定されていません。',
  'Upload::valid' => 'データが不完全です。',
  'Upload::type' => '許可されていないファイルタイプです。',
  'Upload::size' => 'ファイルサイズ制限以上のファイルです。',
 ),
);

解説


バリデーション Validation::factory();
バリデーションインスタンスを作成します。3.0.xでは'Validate::'だったので注意です。

バリデーションルールの設定 Validation::rules();
バリデーションルールを設定します。こちらも3.0.xから変更があり、引数の渡し方が違っていますので注意です。
今回はファイルアップロードですので、Uploadクラス(ヘルパー)のテストを使用しています。
Upload::not_empty
空でないかチェック
Upload::valid
ファイル情報が適正かチェックします。必須項目の場合は、このルール前にnot_emptyのチェックを行ってください。
Upload::type
拡張子をチェックします。第1引数は(3.0.xとは違い)ファイルを指定します。ここでは3.1.xから追加されたコンテキスト変数':value'(フィールドの値)を使用します。第2引数は、許可する拡張子の文字列を配列で指定します。
Upload::size
ファイルサイズをチェックします。第1引数はファイルを指定し、第2引数は最大ファイルサイズを指定します。書式は、数値+単位(B, K, MiB, GB, etc..)になります。

アップロード処理 Upload::save()
第1引数が、アップロードするファイルのデータ。必須。
第2引数$filenameは、アップロード後のファイル名を任意の名称にする場合に指定。指定がなければ、タイムスタンプ+デフォルト名になり、Upload::$remove_spacesがTRUEの場合(デフォルト)はファイル名に含まれるスペースは、'_'(アンダーバー)に変換されます。
第3引数$directoryは、アップロードするディレクトリを指定します。デフォルト値は、Upload::$default_directoryに保持されており、'upload'です。
第4引数は、アクセス権限を指定します。デフォルトは0644です。
戻り値は、アップロード後のファイルのフルパスが返ってきます。

エラー処理
$validation->errors()の引数は、メッセージファイルのファイル名を指定します。
メッセージファイルの指定があれば、メッセージ配列から設定したメッセージを返し、メッセージファイルの指定がなければ失敗したルール名('Upload::not_empty'など)が返ります。