ファイルのアップロード(Helper)[kohana 3.x]

ファイルのアップロードを行います。

コントローラーの作成

kohanaで提供されているUploadというヘルパークラスを利用してファイルのアップロードを行います。

次のようなコントローラーを作成します。

<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Admin extends Controller_Template {

    function action_upload()
    {
        $this->template->content = View::factory('upload')
        if($_FILES)
        {
            Upload::save($_FILES['file']);
        }
    }
}

Upload::saveメソッドには、保存するファイル情報の他に「新規ファイル名」、「保存先ディレクトリ」、「ファイルのアクセス権」を指定することができます。デフォルトのアップロードディレクトリは、uploadディレクトリに設定されています。

public static save(array $file [,string $filename = NULL,string $directory = NULL,integer $chmod = integer 420])

テンプレートの作成

ファイルをアップロードするためのテンプレート(ビュー)を作成します。

<div id="contents">
<h2>ファイルのアップロード</h2>
<?php echo Form::open(NULL, array('enctype' => 'multipart/form-data'));?>
<fieldset>
<div>
<?php echo Form::label('file','ファイル:');?>
<?php echo Form::file('file',array('size' => 80));?>
<div>
<div>
<?php echo Form::submit(NULL, 'アップロード');?>
</div>
</fieldset>
<?php echo Form::close();?>
<?php include Kohana::find_file('views', 'templates/errors') ?>
</div>

ファイルをアップロードするには、enctype属性multipart/form-dataに設定する 必要があります。※MIMEのマルチパートデータとしてファイルを送信するようにします。

Validationとメッセージ

アップロードするファイルの形式を制限したり、サイズを制限したい場合があります。 ここでは、アップロードされるファイルを確認しエラー処理を行ってみます。

コントローラーを次のように作成します。

<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Admin extends Controller_Template {

    function action_upload()
    {
        $this->template->content = View::factory('upload')
                                       -> bind('errors',$errors);

        $validate = Validate::factory($_FILES);
        $validate->rules('file',
            array('Upload::not_empty' => array(), 
              'Upload::type' =>array('Upload::type' => array('jpg','png','gif')), 
            )
        );

        $errors = array();

        if ($validate->check())
        {
            // アップロード成功
            Upload::save($_FILES['file']);
        }
        else
        {
            // エラー処理
            $errors = $validate->errors('upload');
        }
    }
}

この例では、ファイル入力フィールド(name属性がfile)へファイルタイプの指定と 必須入力のルールを追加しています。ルールは、フィールド名とルール(Function又はStaticメソッド)を 設定します。

他にもサイズ指定(Upload::size)などが用意されているようです。

$validate->errorsには、メッセージファイルのファイル名を指定します。

メッセージの作成

application/messagesディレクトリにupload.phpを次のように作成します。

<?php defined('SYSPATH') OR die('No direct access allowed.'); 
 
return array
(
    'file' => array(
        'Upload::not_empty'    	=> 'ファイルが指定されていません。',
        'Upload::type'    	=> 'jpg,png,gif以外のファイルが指定されています。',
        'default'  		=> 'アップロードに失敗しました。'),
);