PHPは配列と手順に従ってファイルのアップロードを完了します
フォームによって送信されたファイルの內(nèi)容は file.php を指します。
アップロードされたファイルは、file.php の PHP コードを通じて処理されます。
アップロードする名前の付いた寫真を選択します。畫像の名前が psu.jpg であると仮定します。クリックしてアップロードします。
PHP はファイルデータ専用のシステム関數(shù) $_FILES を用意しており、アップロードされたファイルの関連データはすべてこのシステム関數(shù)に保存されます。
PHP ファイルで、$_FILES を印刷して、この配列の構(gòu)造を観察します。
<?php //var_dump()或print_r() //打印變量的相關(guān)信息,將變量的信息詳細(xì)的展示出來(lái) var_dump($_FILES); ?>
印刷結(jié)果の配列構(gòu)造は次のとおりです:
array (size=1) 'file' => array (size=5) //文件名 'name' => string 'psu.jpg' (length=7) //文件的mime類型 'type' => string 'image/jpeg' (length=10) //緩存文件,上傳的圖片即保存在這里 'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23) //錯(cuò)誤碼,詳見上面錯(cuò)誤碼介紹 'error' => int 0 //上傳的文件大小 'size' => int 225824
上記の配列構(gòu)造が得られます。
ファイル処理プロセスを開始できます。
最初のステップは、エラー コードを特定することです:
<?php if($_FILES['file']['error'] > 0){ switch ($_FILES['file']['error']) { //錯(cuò)誤碼不為0,即文件上傳過(guò)程中出現(xiàn)了錯(cuò)誤 case '1': echo '文件過(guò)大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上傳'; break; case '4': echo '文件沒有被上傳'; break; case '6': echo '找不到指定文件夾'; break; case '7': echo '文件寫入失敗'; break; default: echo "上傳出錯(cuò)<br/>"; } }else{ //錯(cuò)誤碼為0,即上傳成功,可以進(jìn)行后續(xù)處理,處理流程見下文 } ?>
上記のコードは、エラー コードと対応するエラーの詳細(xì)を示しています。エラー コードに基づいて、正確なエラー プロンプトを生成できます。
2 番目のステップは、ファイルがサイズを超えているかどうかを判斷することです。 実際のプロジェクトでは、システムハードウェアの制限とストレージデバイスの制限により、ユーザーが無(wú)制限にファイルをアップロードすることは不可能であるため、ユーザーがアップロードするファイルのサイズを制限する必要があります。適切な制限サイズを定義すると、アプリケーションをより安定して実行できます。
<?php //判斷錯(cuò)誤 if ($_FILES['file']['error'] > 0) { //有錯(cuò)誤可停止執(zhí)行 } else { //當(dāng)前上傳文件無(wú)誤,運(yùn)行本段代碼 //判斷文件是否超出了指定的大小 //單位為byte $MAX_FILE_SIZE = 100000; if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { //判斷,如果上傳的文件,大小超出了我們給的限制范圍,退上傳并產(chǎn)生錯(cuò)誤提示 exit("文件超出指定大小"); } } ?>
$MAX_FILE_SIZE として指定するファイル サイズを定義します。この変數(shù)のカウント単位はバイトであり、アップロードされたファイルの $_FILES['file']['size'] のサイズに対応します。
サンプルコードでは、サイズが約100K以下のファイルが制限となります。
3 番目のステップは、ファイルの MIME タイプが正しいかどうかを確認(rèn)することです。
多くの場(chǎng)合、ファイルアップロード機(jī)能は、ユーザーがアップロードしたファイルが要件を満たしているかどうかを判斷する必要があり、利用できないファイルをアップロードすると、オンラインアプリケーションの全體的な表示効果に悪影響を及ぼします。したがって、MIME タイプとサフィックス名を使用して、ユーザーがアップロードしたファイルが要件を満たしているかどうかを判斷する必要があります。
以下のサンプル コードでは、現(xiàn)在のプロジェクト要件がアップロードされた畫像を指定し、接尾辭 GIF または jpg が付いたファイルをアップロードすることを要求していると想定しています。ユーザーが要件を満たさないファイルをアップロードすると、エラー メッセージが返されます。
<?php /*判斷后綴名和MIME類型是否符合指定需求 例如: 當(dāng)前項(xiàng)目指定上傳后綴為.jpg或.gif的圖片,則$allowSuffix = array('jpg','gif'); */ //定義允許的后綴名數(shù)組 $myImg = explode('.', $_FILES['file']['name']); /* explode() 將一個(gè)字符串用指定的字符切割,并返回一個(gè)數(shù)組,這里我們將文件名用'.''切割,結(jié)果存在$myImg中,文件的后綴名即為數(shù)組的最后一個(gè)值 */ $myImgSuffix = array_pop($myImg); /* 根據(jù)上傳文件名獲取文件的后綴名 使用in_array()函數(shù),判斷上傳文件是否符合要求 當(dāng)文件后綴名不在我們?cè)试S的范圍內(nèi)時(shí)退出上傳并返回錯(cuò)誤信息 */ if(!in_array($myImgSuffix, $allowSuffix)){ exit("文件后綴名不符"); } /* mime類型和文件后綴名的對(duì)應(yīng)關(guān)系,我們可以通過(guò)很多途徑查詢到,為了避免用戶自主修改文件后綴名造成文件無(wú)法使用。 mime類型也必須做出限制檢查mime類型,是為了防止上傳者直接修改文件后綴名 導(dǎo)致文件不可用或上傳的文件不符合要求。 */ //數(shù)組內(nèi)容為允許上傳的mime類型 $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif" ); if(!in_array($_FILES['file']['type'], $allowMime)){ //判斷上傳文件的mime類型是否在允許的范圍內(nèi) exit('文件格式不正確,請(qǐng)檢查'); //如果不在允許范圍內(nèi),退出上傳并返回錯(cuò)誤信息 } ?>
4 番目のステップは、指定されたパスとファイル名を生成することです。
プロジェクトのファイル配置に応じて、ファイル名の重複によるエラーを回避するために、特定の形式に従ってランダムなファイル名が生成されます。
<?php //指定上傳文件夾 $path = "upload/images/"; /* 根據(jù)當(dāng)前時(shí)間生成隨機(jī)文件名,本行代碼是使用當(dāng)前時(shí)間 + 隨機(jī)一個(gè)0-9的數(shù)字組合成文件名,后綴即為前面取到的文件后綴名 */ $name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix; ?>
5 番目のステップは、ファイルがアップロードされたかどうかを判斷することです。
is_uploaded_file()関數(shù)は、対象のファイルがアップロードされたファイルかどうかを判定する専用関數(shù)です。
<?php //使用is_uploaded_file()判斷是否是上傳文件,函數(shù)介紹見上文 if(is_uploaded_file($_FILEs['file']['tmp_name'])){ } ?>
ステップ6、ファイルを指定された場(chǎng)所に移動(dòng)します。
move_uploaded_file() 関數(shù)を使用して、ファイルを指定した場(chǎng)所に移動(dòng)し、名前を付けます。 Linux システムにはターゲット ディレクトリに対するアクセス許可があり、ディスク容量が十分であるかどうかが考慮されることに注意してください。そうでない場(chǎng)合、アップロード操作は失敗します。
<?php /* 使用move_uploaded_file()移動(dòng)上傳文件至指定位置,第一個(gè)參數(shù)為上傳文件,第二個(gè)參數(shù)為我們?cè)谇懊嬷付ǖ纳蟼髀窂胶兔Q。 */ if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){ //提示文件上傳成功 echo "上傳成功"; }else{ /* 文件移動(dòng)失敗,檢查磁盤是否有足夠的空間,或者linux類系統(tǒng)中文件夾是否有足夠的操作權(quán)限 */ echo '上傳失敗'; } }else{ echo '不是上傳文件'; } } ?>
このファイル スニペットをファイル全體に整理しました:
<?php if ($_FILES['file']['error'] > 0) { switch ($_FILES['file']['error']) { //錯(cuò)誤碼不為0,即文件上傳過(guò)程中出現(xiàn)了錯(cuò)誤 case '1': echo '文件過(guò)大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上傳'; break; case '4': echo '文件沒有被上傳'; break; case '6': echo '找不到指定文件夾'; break; case '7': echo '文件寫入失敗'; break; default: echo "上傳出錯(cuò)<br/>"; } } else { $MAX_FILE_SIZE = 100000; if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { exit("文件超出指定大小"); } $allowSuffix = array( 'jpg', 'gif', ); $myImg = explode('.', $_FILES['file']['name']); $myImgSuffix = array_pop($myImg); if (!in_array($myImgSuffix, $allowSuffix)) { exit("文件后綴名不符"); } $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif", ); if (!in_array($_FILES['file']['type'], $allowMime)) { exit('文件格式不正確,請(qǐng)檢查'); } $path = "upload/images/"; $name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix; if (is_uploaded_file($_FILEs['file']['tmp_name'])) { if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) { echo "上傳成功"; } else { echo '上傳失敗'; } } else { echo '不是上傳文件'; } } ?>