この機能により、ユーザーはテキスト ファイルとバイナリ ファイルをアップロードできます。 PHP の認証機能とファイル操作機能を使用すると、誰にアップロードを許可するか、アップロード後のファイルの処理方法を完全に制御できます。
PHP は、RFC-1867 標準に準拠する任意のブラウザ (Netscape Navigator 3 以降、パッチ適用された Microsoft Internet Explorer 3 以降を含む) からアップロードされたファイルを受け入れることができます。
注: 関連する設定
については、php.ini の file_uploads、upload_max_filesize、upload_tmp_dirpost_max_size、および max_input_time 設定オプションを参照してください。
例 #1 ファイル アップロード フォーム
次のようにファイル アップロードをサポートする特別なフォームを作成できます: 上の例の
<!-- The data encoding type, enctype, MUST be specified as below --> <form enctype="multipart/form-data" action="__URL__" method="POST"> <!-- MAX_FILE_SIZE must precede the file input field --> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <!-- Name of input element determines name in $_FILES array --> Send this file: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form>
__URL__ は、実際の PHP ファイルを指すように置き換える必要があります。
MAX_FILE_SIZE 隠しフィールド (単位はバイト) はファイル入力フィールドの前に配置する必要があり、その値は受信したファイルの最大サイズです。これはブラウザに対する推奨事項であり、PHP もこれをチェックします。この設定はブラウザ側で簡単にバイパスできるため、この機能を使用して大きなファイルをブロックすることは期待しないでください。実際、PHP 設定の最大アップロード ファイル サイズは期限切れになりません。ただし、この項目をフォームに追加することをお勧めします。これにより、ユーザーが大きなファイルのアップロードを待って時間を費やした後に、ファイルが大きすぎてアップロードに失敗したというトラブルを回避できます。
注:
ファイルアップロードフォームの属性が enctype="multipart/form-data" であることを確認してください。そうでない場合、ファイルはアップロードできません。
グローバル変数 $_FILES は、PHP 4.1.0 以降に存在します (以前のバージョンでは $HTTP_POST_FILES に置き換えられました)。この配列には、アップロードされたすべてのファイルに関する情報が含まれています。
上記の例の$_FILES配列の内容は以下の通りです。上の例に示すように、ファイル アップロード フィールドの名前は userfile であると仮定します。名前は何でも構いません。
$_FILES['userfile']['name']
クライアント マシン ファイルの元の名前。
$_FILES['userfile']['type']
ファイルの MIME タイプ (ブラウザーがこの情報を提供する場合)。例は「画像/gif」です。ただし、この MIME タイプは PHP 側ではチェックされないため、鵜呑みにしないでください。
$_FILES['userfile']['size']
アップロードされたファイルのサイズ (バイト単位)。
$_FILES['userfile']['tmp_name']
ファイルのアップロード後にサーバーに保存される一時ファイル名。
$_FILES['userfile']['error']
ファイルのアップロードに関連するエラー コード。このプロジェクトは PHP バージョン 4.2.0 で追加されました。
ファイルがアップロードされると、php.ini の Upload_tmp_dir が別のパスに設定されていない限り、デフォルトでサーバーのデフォルトの一時ディレクトリに保存されます。サーバー側のデフォルトの一時ディレクトリは、PHP 実行環境の環境変数 TMPDIR を変更することでリセットできますが、PHP スクリプト内で putenv() 関数を実行して設定しても効果はありません。この環境変数は、アップロードされたファイルに対して他の操作も実行されていることを確認するために使用することもできます。
例 #2 ファイルのアップロードを有効にする
詳細については、関数 is_uploaded_file() と move_uploaded_file() を確認してください。次の例では、フォームによって提供されるファイルのアップロードを処理します。
<?php // 在PHP4.1.0版本以前, 应该使用$HTTP_POST_FILES来替代$_FILES. $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre class="brush:php;toolbar:false">'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully uploaded.\n"; } else { echo "Possible file upload attack!\n"; } echo 'Here is some more debugging info:'; print_r($_FILES); print ""; ?>
アップロードされたファイルを受け入れる PHP スクリプトは、次にファイルに対してどのような操作を行うかを決定するために、論理的に必要なチェックを実装する必要があります。たとえば、$_FILES['userfile']['size'] 変数を使用して大きすぎるまたは小さすぎるファイルを除外したり、$_FILES['userfile']['type'] 変数を使用してファイル タイプと特定の規格が一致しないファイルは除外されますが、この値はクライアントによって完全に制御され、PHP 側ではチェックされないため、これは一連のチェックの最初のステップとしてのみ考慮してください。 PHP 4.2.0 以降では、$_FILES['userfile']['error'] 変数を使用して、さまざまなエラー コードに基づいて次のステップを計画することもできます。いずれの場合も、ファイルを一時ディレクトリから削除するか、別の場所に移動してください。
フォームでアップロードされたファイルが選択されていない場合、PHP 変数 $_FILES['userfile']['size'] の値は 0 になり、$_FILES['userfile']['tmp_name'] は空になります。
ファイルが他の場所に移動されていないか、名前が変更されていない場合、ファイルはフォームリクエストの最後に削除されます。
例 #3 ファイルの配列のアップロード
PHP の HTML 配列機能は、ファイルの種類もサポートしています。
リーリー