Zend_File_Transfer(日本語)Zend_File_Transfer を使用すると、 ファイルのアップロードやダウンロードを管理できます。 組み込みのバリデータを使ってファイルを検証したり、 フィルタによってファイルを変更したりという機能があります。 Zend_File_Transfer はアダプタ形式を採用しており、 HTTP や FTP、WEBDAV などのさまざまな転送プロトコルを同じ API で使用できます。
Zend_File_Transfer の使い方はきわめて単純です。 ふたつの部分から成り立っており、 アップロードを行う HTTP フォームとアップロードされたファイルを Zend_File_Transfer で処理するコードを作成します。 次の例を参照ください。 Example #1 シンプルなファイルアップロードフォーム これは、基本的なファイルアップロード処理の例です。 まずはファイルアップロードフォームから。 今回の例では。アップロードしたいファイルはひとつです。
HTML を直接作成するのではなく、利便性を考慮して Zend_Form_Element_File を使っていることに注意しましょう。 次はアップロードしたファイルを受け取る側です。 今回の例では、受け取る側は /file/upload となります。そこで、 'file' コントローラにアクション upload() を作成します。 このコードは Zend_File_Transfer のもっともシンプルな使用法を示すものです。 ローカルの保存先を setDestination() メソッドで指定して receive() メソッドをコールします。 アップロード時に何らかのエラーが発生した場合は、 返された例外の中でその情報を取得できます。
Zend_File_Transfer がサポートするアダプタZend_File_Transfer は、 さまざまなアダプタと転送方向をサポートするように作られています。 ファイルのアップロードやダウンロードだけでなく、転送 (あるアダプタでのアップロードと別のアダプタでのダウンロードを同時に行う) にも対応できるように設計されています。 しかし、Zend Framework 1.6 の時点で存在するアダプタは Http アダプタひとつだけです。 Zend_File_Transfer のオプションZend_File_Transfer やそのアダプタはさまざまなオプションをサポートしています。 オプションはコンストラクタで指定することもできますし、 setOptions($options) で指定することもできます。 getOptions() は、実際に設定されているオプションを返します。 サポートするオプションは次のとおりです。
ファイルのチェックZend_File_Transfer のメソッドの中には、さまざまな前提条件をチェックするためのものもあります。 これらは、アップロードされたファイルを処理する際に便利です。
Example #2 ファイルのチェック
さらなるファイル情報Zend_File_Transfer は、ファイルについてのさらなる情報を返すことができます。 次のメソッドが使用可能です。
getFileName() の最初のパラメータには、 要素の名前を渡すことができます。名前を省略した場合は、 すべてのファイル名を配列で返します。 multifile 形式であった場合も結果は配列となります。 ファイルがひとつだけだった場合は結果を文字列で返します。
デフォルトでは、ファイル名はフルパス形式で返されます。
パス抜きのファイル名だけがほしい場合は、2 番目のパラメータ
Example #3 ファイル名の取得
getFileSize() は、デフォルトではファイルサイズを SI 記法で返します。 つまり、たとえば 2048 ではなく 2kB のようになるということです。単にサイズだけが知りたい場合は、オプション useByteString を FALSE に設定してください。 Example #4 ファイルのサイズの取得
getHash() の最初のパラメータには、ハッシュアルゴリズムの名前を指定します。 使用できるアルゴリズムについては » PHP の hash_algos メソッド を参照ください。アルゴリズムを省略した場合は crc32 をデフォルトのアルゴリズムとして使用します。 Example #5 ファイルのハッシュの取得
getMimeType() はファイルの mimetype を返します。 複数のファイルがアップロードされた場合は配列、そうでない場合は文字列を返します。 Example #6 ファイルの mimetype の取得
Warning
ありえる例外このメソッドは、fileinfo 拡張モジュールが使用可能な場合はそれを使用することに注意しましょう。 この拡張モジュールがみつからなかった場合は、mimemagic 拡張モジュールを使用します。 それもみつからなかった場合は、例外を発生します。 Warning
Original data within $_FILESDue to security reasons also the original data within $_FILES will be overridden as soon as Zend_File_Transfer is initiated. When you want to omit this behaviour and have the original data simply set the detectInfos option to FALSE at initiation. This option will have no effect after you initiated Zend_File_Transfer. ファイルアップロードの進捗Zend_File_Transfer では、ファイルアップロードの進捗状況を知ることができます。 この機能を使用するには、APC 拡張モジュール (ほとんどの PHP 環境においてデフォルトで提供されています) あるいは uploadprogress 拡張モジュールが必要です。 これらの拡張モジュールがインストールされていれば、自動検出してそれを使用します。 進捗状況を取得するには、いくつかの事前条件があります。 まず、APC あるいは uploadprogress のいずれかを有効にする必要があります。APC の機能は php.ini で無効化できることに注意しましょう。 次に、ファイルを送信するフォームの中に適切な hidden フィールドを追加しなければなりません。Zend_Form_Element_File を使う場合は、この hidden フィールドは Zend_Form が自動的に追加します。
これらふたつの条件さえ満たせば、ファイルアップロードの進捗状況を
progressbar アダプタを使用するZend_ProgressBar を使用して、 実際の進捗状況を取得した上でそれをシンプルにユーザに見せることができます。 そのためには、 getProgress() を最初にコールするときにお望みの Zend_ProgressBar_Adapter を追加しなければなりません。 どのアダプタを使用すればいいのかについては Zend_ProgressBar の標準のアダプタ の章を参照ください。 Example #7 progressbar アダプタを使用した実際の状態の取得
完全な処理は、バックグラウンドで getProgress() によって行われます。 getProgress() を手動で使用するZend_ProgressBar を使わずに手動で getProgress() を動作させることもできます。 getProgress() を何も設定なしでコールします。 すると、いくつかのキーを含む配列が返されます。 使用している PHP 拡張モジュールによってその内容は異なります。 しかし、次のキーは拡張モジュールにかかわらず返されます。
それ以外に返されるキーについては各拡張モジュールが直接返すものであり、 チェックしていません。 次の例は、手動で使用する方法を示すものです。 Example #8 手動での進捗状況表示の使用法
|