My_Form_File

My_Form_Fileはファイルのアップロードを行うためのコンポーネントです。ZF-Exの管理画面では登録処理に確認画面を経由するため、一時保存ディレクトリに保存した上で対象のディレクトリへと保存するようになっています。サンプル中ではadminモジュールのproductsControllerでそのモジュールを使用した処理が記述されています。

このコンポーネントはZend FrameworkのZend_File_Transferをベースにして作成されています。Zend_File_Transferのリファレンスは下記ページをご覧ください。

http://framework.zend.com/manual/ja/zend.file.transfer.introduction.html

基本的な使用方法

My_Form_Fileで主に使用するメソッドは次の2つです。

  • My_Form_File::uploadFileTmp($name): ファイルを一時保存します。$nameではPOST送信したフォームの名前を入力します。アップロードするディレクトリは以下のディレクトリに保存されます。また、この時にファイル名はランダム英数に変更され、変更後のファイル名を返します。
  • tmp
    • file

 

  • My_Form_File::moveTmpFile($tmp_name, $file_name): tmpディレクトリにあるファイルを本来のディレクトリに移動します。移動先のディレクトリはデフォルトでは下記の公開ディレクトリとなっていますが、必要であればMy_Form_File::setFileDir($file_dir)により変更可能です。
  • public
    • uploads

 

複数ファイルのアップロード

ZF-Exでは複数のファイルアップロードにも対応しています。この場合、手順やメソッドが次のように変更となります。

  • My_Form_File::setTmpField($tmp_fields): 一時保存フィールドのパラメータ名をセットします。$tmp_fieldsは(一時保存ファイルのパラメータ名)=>(対象ファイルパラメータ名)という形式の配列となります。このメソッドでパラメータのセットは以下の操作より前に行う必要があります。

 

  • My_Form_File::uploadFilesTmp(): 複数のファイルを同時に一時保存します。My_Form_File::uploadFileTmp($name)と異なり、対象となるファイルパラメータ名をあらかじめ保存しているため引数は不要です。(一時ファイルのパラメータ名)=>(変更後のファイル名)という形式で配列を返します。

 

  • My_Form_File::moveTmpFiles($data): tmpディレクトリにあるファイルを複数本来のディレクトリに移動します。それぞれのファイルについて、ファイルパラメータ名をキーとする値、及び一時保存ファイルパラメータ名をキーとする値が$data配列内にあれば処理を実行し、いずれかが不足していれば処理を行いません。

 

バリデーションの設定について

My_Form_Fileではアップロードしたファイルに対してバリデーション判定を行う事ができます。バリデーションを行うには次のメソッドを使用します。

  • My_Form_File::setFieldName($name, $field_name): エラーメッセージ用にフィールドの名前をセットします。$nameがモデル名で、それに対するフィールド名をトランスレータより取得します。アップロードするファイルが一つであればstringで、複数であればarrayで指定します。
  • My_Form_File::addValidator($validator, $value): バリデーションの条件を追加します。
  • My_Form_File::isValid(): バリデーションチェックを行います。

 

バリデーションを実施するには、コントローラ中に次のように記述します。

$file = new My_Form_File();
$file->setFieldName('フィールド名');
$file->addValidator('Extension', array('gif', 'jpg', 'png')); // 拡張子。ここに含まれていれば許可される。
$file->addValidator('Size', 256 * 1024, 'file_1'); // file_1のファイルサイズ。ここでは256kB
$file->addValidator('Size', 512 * 1024, 'file_2'); // file_2のファイルサイズ。ここでは512kB

$file_valid = $file->isValid();
if($file_valid !== true){
    $file_error_message = $file->getErrorMessages(); // エラーメッセージをセット。file_1とfile_2にエラーメッセージの配列が格納されている。
    // $file->getEachErrorMessages() とすれば1種のファイルごとに最初のエラーメッセージを取得する。

    throw new Zend_Validate_Exception();
}
...

 

Zend FrameworkのZend_File_Transfer用バリデータは全て利用可能です。利用可能なバリデータの情報については下記ページをご覧下さい。

http://framework.zend.com/manual/ja/zend.file.transfer.validators.html

エラーメッセージは下記のコードファイル中に書かれています。Validate.File.(エラーコード)というフォーマットによりそれぞれのエラーメッセージを記述します。必要であれば書き換えを行ってください。

  • application
    • messages
      • ja
        • code.ini

 

Validate.File.HASH_DOES_NOT_MATCH = "%sのハッシュが正しくありません"
Validate.File.COUNT_TOO_FEW = "%min%個以上のファイルをアップロードしてください"
Validate.File.DEFAULT_MESSAGE = "%sが不正です"
Validate.File.NO_FILE = "%sのファイルがありません"

 

必須チェックについて

ファイルのアップロードが必須の場合、バリデーションとしてNotEmptyを指定します。これをセットしない場合空欄である事を許可し、ファイルがアップロードされていない時には他のバリデーションチェックも働かなくなります。NotEmptyの指定方法は他の通常のバリデーションと違いはありません。

$file = new My_Form_File();
$file->setFieldName('フィールド名');
$file->addValidator('NotEmpty'); // 必須チェックのセット

$file_valid = $file->isValid();
if($file_valid !== true){
    ...
}
...

これはZend Frameworkにはない、ZF-Ex独自のバリデータになります。

 

その他のメソッド

My_Form_Fileで利用可能なメソッドとして、次のものがあります。

  • My_Form_File::isTmpFileExists($tmp_file_name): 一時保存ディレクトリに$tmp_file_nameが存在するか確認します。
  • My_Form_File::removeTmpFile($tmp_file_name, $expire_time = 0): 一時保存ディレクトリにある$tmp_file_nameを削除します。$expire_timeを指定している場合、一時保存ファイルの更新時刻を確認し、$expire_timeの秒数を経過していた場合にのみ削除します。
  • My_Form_File::removeAllTmpFiles($expire_time = 0): 一時保存ディレクトリにある全てのファイルを削除します。$expire_timeを指定している場合、それぞれの一時保存ファイルの更新時刻を確認し、$expire_timeの秒数を経過していた場合にのみ削除します。