PHP文件上傳,php.ini中的配置項為:
配置項 | 默認值 | 配置描述 |
file_uploads | ON | PHP腳本是否可以接受HTTP文件上傳 |
upload_max_filesize | 2M | 限制PHP處理上傳文件大小的最大值,此值必須小於post_max_size值 |
post_max_size | 8M | POST方法接受信息的最大值,除了上傳文件,可能游其他的表單域,所以要大於upload_max_filesize |
upload_tmp_dir | NULL | 上傳文件臨時路徑,對於擁有此服務器的進程用戶必須是可寫的。默認為操作系統的臨時文件夾,Linux的是在/tmp目錄下 |
全局數組$_FILES,其中myfile為表單中name的值:
數組 | 描述 |
$_FILES['myfile']['name'] | 上傳文件的原文件名,包括后綴 |
$_FILES['myfile']['tmp_name'] | 保存在upload_tmp_dir中的臨時文件名 |
$_FILES['myfile']['size'] | 上傳的文件大小,單位為字節 |
$_FILES['myfile']['error'] | 上傳文件時產生的常見錯誤號: 0:表示沒有錯誤,上傳成功 1:表示上傳的文件超過了upload_max_file的值 2.上傳的文件大小超過了表單中MAX_FILE_SIZE的值 3:表示只有部分上傳 4.表示沒有上傳任何文件 |
$_FILES['myfile']['type'] | 上傳文件的MIME類型 |
兩個函數:
- 函數原型為:bool is_uploaded_file(string filename)。用於判斷是否為HTTP POST上傳的文件,參數必須類似$_FILES['myfile']['tmp_name'],不能是$_FILES['myfile']['name'],如果是則返回true,用於防止潛在的攻擊者對原本不能通過腳本交互的文件進行非法管理。
- 函數原型為:bool move_uploaded_file(string filename,string destination)。將HTTP POST上傳的臨時文件移動到新的路徑。成功返回TRUE
上傳文件流程:
- 通過$_FILES['myfile']['error']判斷是否有錯誤產生,有錯誤則提示並退出腳本。
- 把$_FILES['myfile']['name']分割為數組,獲取文件后綴名,或者通過$_FILES['myfile']['type']判斷是否為允許的上傳類型,如果不在允許上傳的類型中,提示並退出腳本。
- 通過$_FILES['myfile']['size']判斷是否超出了PHP限制的大小。
- 通過is_uploaded_file()函數和move_uploaded_file()將文件上傳到相應的目錄中。
文件上傳PHP代碼:

1 <?php 2 $save_path = "./uploads"; //文件保存路徑 3 $max_size = 1000000; //上傳文件最大值 4 $allow_type = array('gif','png','jpg','jpeg'); //允許上傳的類型 5 6 //判斷保存的目錄是否存在,如果不存在則創建保存目錄 7 if(!is_dir($save_path)) 8 mkdir($save_path); 9 10 //判斷文件是否上傳成功 11 if($_FILES['myfile']['error']){ 12 echo "文件上傳失敗<br>"; 13 switch($_FILES['myfile']['error']){ 14 case 1: die('上傳的文件超出系統的最大值<br>');break; 15 case 2: die('上傳的文件超出表單允許的最大值<br>');break; 16 case 3: die('文件只有部分被上傳<br>');break; 17 case 4: die('沒有上傳任何文件<br>');break; 18 default: die('未知錯誤<br>');break; 19 } 20 } 21 22 //通過文件的后綴判斷是否為合法的文件名 23 $hz = array_pop(explode('.',$_FILES['myfile']['name'])); 24 if(!in_array($hz,$allow_type)){ 25 die("該類型不允許上傳<br>"); 26 } 27 28 //判斷文件是否超過允許的大小 29 if($max_size < $_FILES['myfile']['size']){ 30 die("文件超出PHP允許的最大值<br>"); 31 } 32 33 //為了防止文件名重復,在系統中使用新名稱 34 $save_file_name = date('YmdHis').rand(100,900).'.'.$hz; 35 36 //判斷是否為HTTP POST上傳的,如果是則把文件從臨時目錄移動到保存目錄,並輸出保存的信息; 37 if(is_uploaded_file($_FILES['myfile']['tmp_name'])){ 38 if(move_uploaded_file($_FILES['myfile']['tmp_name'],$save_path.'/'.$save_file_name)){ 39 echo "上傳成功!<br>文件{$_FILES['myfile']['name']}保存在{$save_path}/{$save_file_name}!<br>"; 40 } 41 else{ 42 echo "文件移動失敗!<br>"; 43 } 44 } 45 else{ 46 die("文件{$_FILES['myfile']['name']}不是一個HTTP POST上傳的合法文件"); 47 } 48
文件上傳的html表單:

1 <html> 2 <head> 3 <title>uploadfile</title> 4 <meta http-equiv="content-type" content="utf-8"> 5 </head> 6 <body> 7 <form method="POST" action="uploadfile.php" enctype="multipart/form-data"> 8 <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 9 選擇文件:<input type="file" name="myfile" ><br><br> 10 <input type="submit" name="sub" value="upload"> 11 </form> 12 </body> 13 </html>
表單要加上enctype="multipart/form-data",表示上傳的表單要傳遞一個文件:
需要改進的地方:
- 這些代碼只能處理單個文件上傳,應該做一些改進,從而能處理多個文件上傳
- 可以封裝成為一個函數或者一個類,提高代碼的復用性。
---------------------------- 聲明的分割線---------------------------
- 本文只適合實驗,不適合現實應用,若造成不良后果,本人概不負責。
- 本文為原創博客,可以在個人平台自由轉載,但需要注明出處,附上鏈接,否則視為盜用。嚴禁用於商業用途,如有需要,聯系本人授權后方能使用
- 如有錯誤,歡迎大家斧正。若想交流,可發消息聯系本人。