章 18. ファイルアップロードの処理

目次
POST メソッドによるアップロード
陥りやすい落とし穴
複数ファイルのアップロード
PUT メソッドのサポート

POST メソッドによるアップロード

PHP は、全ての RFC-1867 対応ブラウザ(Netscape Navigator 3 以上、 Microsoft からのパッチをあてた Microsoft Internet Explorer 3 またはパッチ無しの それ以降の版を含みます)からファイルアップロードを 受けることができます。 この機能では、テキストとバイナリファイルの両方のアップロードが可能です。 PHP の認証関数およびファイル操作関数を用いて、アップロードを許可するユーザーと アップロード後にそのファイルを使用して行う動作を完全に制御することが 可能です。

PHPはNetscape ComposerおよびW3CのAmayaクライアントにより使用される PUTメソッドによるファイルアップロードもサポートしています。 詳細は、PUT メソッドのサポート を参照下さい。

ファイルアップロード画面は、次のような特別なフォームを作成することにより、 作成することができます。

例 18-1. ファイルアップロード用のフォーム


<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
    
_URL_ はPHPファイルを指す必要があります。MAX_FILE_SIZE hidden フィールド MAX_FILE_SIZEは、入力フィールド file の前に置く必要があります。 この値は、取得可能なファイルの最大サイズを規定します。 この値はバイト数で指定します。 アップロードに成功した場合、(URLで指定した)送信先ファイルで 次の変数が設定されます。

上記の変数のうち、"$userfile" は、 アップロード用フォーム中の TYPE=file を有する INPUT フィールドの NAME フィールドの値とは関連がないことに注意して下さい。 上のアップロード用フォームの例においては、その NAME フィールドの値を "userfile" としています。

ファイルは、デフォルトでサーバーにおけるデフォルトの テンポラリディレクトリに保存されます。 このディレクトリは、PHP を実行する環境において環境変数 TMPDIR を設定することにより変更することができます。 しかし、PHP スクリプトの内部から putenv 関数により 設定しても上手くいきません。

アップロードされたファイルを受け取る PHP スクリプトは、 アップロードされたファイルを用いて何をするべきかを 決めるために必要なロジックを全て実装する必要があります。 例えば、$file_size 変数を使用して、小さすぎたり、大きすぎたりする ファイルを捨てることができます。 指定した型以外のファイルを全て捨てるために $file_type 変数を用いることができます。 何らかの方法により、テンポラリディレクトリからファイルを 削除したり、他の場所に移動したりする必要があります。

移動または名前の変更が行われていない場合、リクエストの終了時に そのファイルはテンポラリディレクトリから削除されます。