PHP ファイルのアップロード プロセス
1. 送信ボタンをクリックすると、ブラウザ ユーザーはアップロードされたファイルを含むフォーム データを PHP ハンドラーに送信します
2. Web サーバーと PHP プリプロセッサは、まずフォーム データのサイズが php.ini 設定ファイルの post_max_size オプションで設定された上限を超えているかどうかを判断します。
これを超えると、PHP ハンドラーはフォーム データを取得できなくなり、ファイルのアップロードが失敗するだけでなく、フォーム コントロールに入力されたデータの送信も失敗します。 PHP ハンドラーの事前定義変数 $_GET、$_POST、$_FILES は空の配列になります。制限を超えていない場合、ファイルのアップロードは検証のためにステップ 3 に進みます。
3. フォーム内のファイル サイズが、フォームの非表示フィールド MAX_FILE_SIZE で設定された上限を超えているかどうかを確認します。
この値を超えると、PHP プリプロセッサはステータス コード 2 を返し、ファイルのアップロードは失敗します。
制限を超えていない場合、ファイルのアップロードは検証のために手順 4 に進みます。
(複数のファイルをアップロードする場合、特定のファイルアップロードボックスによるファイルアップロードの失敗は、他のファイルアップロードボックスのアップロード結果には影響しません)
4. フォーム内のファイルがphp.iniを超えているかどうかを確認します。設定ファイルの upload_max_filesize オプションで設定された上限値。
それを超えると、PHP プリプロセッサはステータス コード 1 を返し、ファイルのアップロードは失敗します。
制限を超えていない場合、ファイルのアップロードは検証のために手順 5 に進みます。
5. PHP でファイルのアップロードを実装するには、upload_tmp_dir オプションで定義されたディレクトリに、アップロードされたファイルに 1 対 1 で対応する一時ファイル (デフォルトの拡張子は tmp) を作成する必要があります。アップロードが成功すると、一時ファイルはすぐに消え、PHP プリプロセッサはステータス コード 0 を返します。
ただし、暗黙の書き込み理由 (max_execution_time オプションの設定が小さすぎる、ネットワーク速度が遅いなど) により、一部のファイルをアップロードした後、残りのファイルがアップロードされなくなり、ファイルのアップロードが失敗することがあります。今回、PHP プリプロセッサはステータス コード 3
を返します。
合格した場合、ファイルのアップロードは検査のためにステップ 6 に進みます。
6. ファイルをアップロードするための重要な手順は、一時ファイルが消える前に Web サーバーまたはファイル サーバーに保存することです。 PHP が提供する 2 つの関数: is_uploaded_file() 関数と move_uploaded_file() 関数は、この作業ステップを完了するのに役立ちます。複数のファイルをアップロードすると、同じ名前で保存されたファイルの内容が以下の形式で配列に配置されます。これらは 5 つの配列であり、3 つの配列ではなく、ファイルの 5 つのパラメーターに従って個別に保存されます。したがって、 count($_FILES[‘$myPicture’]) を直接使用すると、答えは 5 になります。
index.php ファイルarray (size=5) 'name' => array (size=3) 0 => string '1.txt' (length=5) 1 => string '2.txt' (length=5) 2 => string '3.txt' (length=5) 'type' => array (size=3) 0 => string 'text/plain' (length=10) 1 => string 'text/plain' (length=10) 2 => string 'text/plain' (length=10) 'tmp_name' => array (size=3) 0 => string 'D:\wamp64\tmp\phpC5E8.tmp' (length=25) 1 => string 'D:\wamp64\tmp\phpC5E9.tmp' (length=25) 2 => string 'D:\wamp64\tmp\phpC5EA.tmp' (length=25) 'error' => array (size=3) 0 => int 0 1 => int 0 2 => int 0 'size' => array (size=3) 0 => int 0 1 => int 0 2 => int 0
<form action="fileSystem.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> <input type="file" name="myPicture[]" size= "25" maxlength="100"><br> <input type="file" name="myPicture[]" size= "25" maxlength="100"><br> <input type="file" name="myPicture[]" size= "25" maxlength="100"><br> <input type="submit" value="提交"> </form>
<?php if (empty($_POST)) { exit("提交的表单数据超过post_max_size的配置"); } $arr = $_FILES['myPicture']; $file =array(); for ($i=0; $i < count($arr['name']); $i++) { $file[$i]['name'] = $arr['name'][$i]; $file[$i]['type'] = $arr['type'][$i]; $file[$i]['tmp_name'] = $arr['tmp_name'][$i]; $file[$i]['error'] = $arr['error'][$i]; $file[$i]['size'] = $arr['size'][$i]; } for ($i=0; $i < count($file); $i++) { switch ($file[$i]['error']) { case 0: $fileName = $file[$i]['name']; $fileTemp = $file[$i]['tmp_name']; $destination = "uploads/" . $file[$i]['name']; move_uploaded_file($fileTemp, $destination); echo "上传成功"; break; case 1: echo "上传附件超过php.ini中的upload_max_filesize选项的限制"; break; case 2: echo "上传附件的大小超过了form表单MAX_FILE_SIZE选项指定的值"; break; case 3: echo "附件只有部分被上传"; break; case 4: echo "没有选择上传附件"; break; } } ?>