PHP文件上傳、客戶端和服務(wù)器端加限制、抓取錯(cuò)誤信息、完整步驟解析
文件上傳分為兩個(gè)部分,HTML顯示部分和PHP處理部分,HTML部分主要是讓用戶來選擇所要上傳的文件,然后通過PHP中的$_FILES,我們可以把文件上傳到服務(wù)器的指定目錄。
1.客戶端頁(yè)面
客戶端的配置
1.表單頁(yè)面
2.表單發(fā)送方式為post
3.表單form中添加enctype="multipart/form-data"
<body> <form action="doaction.php" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit" value="上傳"> </form> </body>
2.處理頁(yè)面doaction
$_FILES:文件上傳變量
print_r($_FILES);
$_FILES:保存著上傳文件的信息
1.name:上傳文件的名稱
2.type:上傳文件的MIME類型
3.tmp_name:上傳到服務(wù)器上的臨時(shí)文件名
4.size:上傳文件的大小
5.error:上傳文件的錯(cuò)誤號(hào)
$filename=$_FILES['myfile']['name']; $type=$_FILES['myfile']['type']; $tmp_name=$_FILES['myfile']['tmp_name']; $size=$_FILES['myfile']['size']; $error=$_FILES['myfile']['error'];
將服務(wù)器上的臨時(shí)文件移動(dòng)到指定文件夾
1.move_uploaded_file(臨時(shí)文件名,‘文件夾名'.$filename); 將服務(wù)器上的臨時(shí)文件移動(dòng)到指定文件夾,叫什么名字($filename),移動(dòng)成功返回true,移動(dòng)失敗返回false。
move_uploaded_file($tmp_name,"wenjian/".$filename);
2.copy("臨時(shí)文件名","文件名".$filename) 將服務(wù)器上的臨時(shí)文件拷貝到指定文件夾
文件上傳配置
file_uploads = on,支持HTTP上傳 upload_tmp_dir= ,臨時(shí)文件保存的目錄 upload_max_filesize=2M,允許上傳文件的最大值 max_file_uploads=20,允許一次上傳的最大文件數(shù) post_max_size=8M,post方式發(fā)送數(shù)據(jù)的最大值
3.錯(cuò)誤信息處理
上傳文件失敗時(shí),判斷一下錯(cuò)誤號(hào),只有為0或者UPLOAD_ERR_OK,才沒有錯(cuò)誤發(fā)生,上傳成功
下面是抓取錯(cuò)誤
if($error==UPLOAD_ERR_OK) { if(move_uploaded_file($tmp_name,"wenjian/".$filename)) { echo "文件".$filename."上傳成功"; }else { echo "文件".$filename."上傳失敗"; } } else { //匹配錯(cuò)誤信息 switch($error) { case 1: echo "上傳文件超過了PHP配置文件中upload_max_filesize選項(xiàng)的值"; break; case 2: echo "超過了表單MAX_FILE_SIZE的限制大小"; break; case 3: echo "文件部分被上傳"; break; case 4: echo "沒有選擇上傳文件"; break; case 6: echo "沒有找到臨時(shí)目錄"; break; case 7: case 8: echo "系統(tǒng)錯(cuò)誤"; break; } } ?>
4.上傳文件限制
《客戶端限制:》
通過表單隱藏域限制上傳文件的最大值
<input type="hidden" name="MAX_FILE_SIZE" value="字節(jié)數(shù)">
通過accept屬性限制上傳文件的類型
<input type="file" name="myfile" accept="文件的MIME類型">
《服務(wù)器端限制》
1.限制上傳文件大小
2.限制上傳文件類型
3.檢測(cè)是否為真實(shí)圖片類型
4.檢測(cè)是否為HTTP POST方式上傳
5.判斷服務(wù)器上存儲(chǔ)的文件夾在不在
6.防止重名產(chǎn)生覆蓋
<?php $fileinfo=$_FILES["myfile"]; $maxsize=2097152; //寫最大的字節(jié)數(shù),自己算 $allowext=array('jpeg','jpg','pnd','gif','wbmp'); //定義一下允許的上傳文件類型 //1.判斷錯(cuò)誤號(hào) if($fileinfo['error']==0) { //1.判斷上傳文件大小 if($fileinfo['size']>$maxsize) { exit('上傳文件過大'); } //2.判斷上傳文件類型是不是在規(guī)定類型中 $ext=strtolower(end(explode(',',$fileinfo['name'])));//截取上傳文件擴(kuò)展名 if(!in_array($ext,$allowext)) // 判斷上傳文件的擴(kuò)展名是不是在定義類型中 { exit('非法文件類型'); } //3.判斷文件是否是通過HTTP POST方式上傳上來的 if(!is_uploaded_file($fileinfo['tmp_name'])) { exit('文件不是通過HTTP POST方式上傳上來的'); } //4.檢測(cè)是否為真實(shí)的圖片類型,而不是認(rèn)為改動(dòng)的 $flag=true; if($flag) { if(!getimagesize($fileinfo['tmp_name'])) { echo "不是真實(shí)的圖片類型"; } } $path='uploads'; //服務(wù)器上存儲(chǔ)文件的文件名 //5.判斷服務(wù)器上存儲(chǔ)的文件夾在不在 if(!file_exists($path)) { mkdir($path,0777,true);//不存在就創(chuàng)建一個(gè)目錄 chmod($path,0777);//加一個(gè)權(quán)限 } //6.確保文件名唯一,防止重名產(chǎn)生覆蓋 $uniname=md5(uniqid(microtime(true),true)).'.'.$ext; //通過MD5加密等措施給文件名取名 $destination=$path.'/'.$uniname; if(move_uploaded_file($fileinfo['tmp_name'],$destination)) //上傳文件 { echo "文件上傳成功"; }else { echo "文件上傳失敗"; } }else { //匹配錯(cuò)誤信息 switch($error) { case 1: echo "上傳文件超過了PHP配置文件中upload_max_filesize選項(xiàng)的值"; break; case 2: echo "超過了表單MAX_FILE_SIZE的限制大小"; break; case 3: echo "文件部分被上傳"; break; case 4: echo "沒有選擇上傳文件"; break; case 6: echo "沒有找到臨時(shí)目錄"; break; case 7: case 8: echo "系統(tǒng)錯(cuò)誤"; break; } } ?>
5.完整的上傳文件步驟
第一步:表單頁(yè)內(nèi)容
<body> <form action="doaction.php" method="post" enctype="multipart/form-data"> //通過表單隱藏域限制上傳文件的最大值 <input type="hidden" name="MAX_FILE_SIZE" value="字節(jié)數(shù)"> //通過accept屬性限制上傳文件的類型 <input type="file" name="myfile" accept="文件的MIME類型"> </form> </body>
第二步:處理界面。定義變量
<?php //$_FILES:文件上傳變量 print_r($_FILES); //$_FILES:保存著上傳文件的信息 /*1.name:上傳文件的名稱 2.type:上傳文件的MIME類型 3.tmp_name:上傳到服務(wù)器上的臨時(shí)文件名 4.size:上傳文件的大小 5.error:上傳文件的錯(cuò)誤號(hào)*/ $filename=$_FILES['myfile']['name']; $type=$_FILES['myfile']['type']; $tmp_name=$_FILES['myfile']['tmp_name']; $size=$_FILES['myfile']['size']; $error=$_FILES['myfile']['error'];
第三步:處理頁(yè)面上服務(wù)器加限制和輸出錯(cuò)誤信息
1.限制上傳文件大小
2.限制上傳文件類型
3.檢測(cè)是否為真實(shí)圖片類型
4.檢測(cè)是否為HTTP POST方式上傳
5.判斷服務(wù)器上存儲(chǔ)的文件夾在不在
6.防止重名產(chǎn)生覆蓋
//服務(wù)器端限制 <?php $fileinfo=$_FILES["myfile"]; $maxsize=2097152; //寫最大的字節(jié)數(shù),自己算 $allowext=array('jpeg','jpg','pnd','gif','wbmp'); //定義一下允許的上傳文件類型 //1.判斷錯(cuò)誤號(hào) if($fileinfo['error']==0) { //1.判斷上傳文件大小 if($fileinfo['size']>$maxsize) { exit('上傳文件過大'); } //2.判斷上傳文件類型是不是在規(guī)定類型中 $ext=strtolower(end(explode(',',$fileinfo['name'])));//截取上傳文件擴(kuò)展名 if(!in_array($ext,$allowext)) // 判斷上傳文件的擴(kuò)展名是不是在定義類型中 { exit('非法文件類型'); } //3.判斷文件是否是通過HTTP POST方式上傳上來的 if(!is_uploaded_file($fileinfo['tmp_name'])) { exit('文件不是通過HTTP POST方式上傳上來的'); } //4.檢測(cè)是否為真實(shí)的圖片類型,而不是認(rèn)為改動(dòng)的 $flag=true; if($flag) { if(!getimagesize($fileinfo['tmp_name'])) { echo "不是真實(shí)的圖片類型"; } } $path='uploads'; //服務(wù)器上存儲(chǔ)文件的文件名 //5.判斷服務(wù)器上存儲(chǔ)的文件夾在不在 if(!file_exists($path)) { mkdir($path,0777,true);//不存在就創(chuàng)建一個(gè)目錄 chmod($path,0777);//加一個(gè)權(quán)限 } //6.確保文件名唯一,防止重名產(chǎn)生覆蓋 $uniname=md5(uniqid(microtime(true),true)).'.'.$ext; //通過MD5加密等措施給文件名取名 $destination=$path.'/'.$uniname; $destination=inocv("UTF-8","gb2312",$destination); //如果上傳的文件名中有漢字,需要轉(zhuǎn)碼一下,用inocv函數(shù),把utf-8轉(zhuǎn)為gb2312. if(move_uploaded_file($fileinfo['tmp_name'],$destination)) //上傳文件 { echo "文件上傳成功"; }else { echo "文件上傳失敗"; } }else {
第四步:匹配錯(cuò)誤信息
switch($error) { case 1: echo "上傳文件超過了PHP配置文件中upload_max_filesize選項(xiàng)的值"; break; case 2: echo "超過了表單MAX_FILE_SIZE的限制大小"; break; case 3: echo "文件部分被上傳"; break; case 4: echo "沒有選擇上傳文件"; break; case 6: echo "沒有找到臨時(shí)目錄"; break; case 7: case 8: echo "系統(tǒng)錯(cuò)誤"; break; } } ?>
以上所述是小編給大家介紹的PHP文件上傳、客戶端和服務(wù)器端加限制、抓取錯(cuò)誤信息、完整步驟,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
php array_keys 返回?cái)?shù)組的鍵名
php中array_keys函數(shù)用于返回包含數(shù)組中所有鍵名的一個(gè)新數(shù)組。本文章向大家詳細(xì)介紹PHP array_keys函數(shù)使用方法。需要的碼農(nóng)可以參考一下2016-10-10ThinkPHP連接數(shù)據(jù)庫(kù)的方式匯總
這篇文章主要介紹了ThinkPHP連接數(shù)據(jù)庫(kù)的方式,包括項(xiàng)目配置文件定義、DSN方式傳參、數(shù)組傳參、模型類里定義等,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12PHP數(shù)據(jù)類型之整數(shù)類型、浮點(diǎn)數(shù)的介紹
本篇文章介紹了,PHP數(shù)據(jù)類型之整數(shù)類型、浮點(diǎn)數(shù)的介紹。需要的朋友參考下2013-04-04thinkphp5框架調(diào)用其它控制器方法 實(shí)現(xiàn)自定義跳轉(zhuǎn)界面功能示例
這篇文章主要介紹了thinkphp5框架調(diào)用其它控制器方法 實(shí)現(xiàn)自定義跳轉(zhuǎn)界面功能,結(jié)合實(shí)例形式分析了thinkPHP5控制器調(diào)用、登陸判斷與界面跳轉(zhuǎn)相關(guān)操作技巧,需要的朋友可以參考下2019-07-07windwos下使用php連接oracle數(shù)據(jù)庫(kù)的過程分享
這篇文章主要介紹了windwos下使用php連接oracle數(shù)據(jù)庫(kù)的過程分享,講解了php連接oracle的必要條件、代碼實(shí)例以及錯(cuò)誤排查等,需要的朋友可以參考下2014-05-05PHP MYSQL簡(jiǎn)易交互式站點(diǎn)開發(fā)
這篇文章主要為大家詳細(xì)介紹了PHP MYSQL簡(jiǎn)易交互式站點(diǎn)開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Laravel 中使用 Vue.js 實(shí)現(xiàn)基于 Ajax 的表單提交錯(cuò)誤驗(yàn)證操作
這篇文章主要介紹了Laravel 中使用 Vue.js 實(shí)現(xiàn)基于 Ajax 的表單提交錯(cuò)誤驗(yàn)證功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-06-06