PHP文件上傳、客戶端和服務(wù)器端加限制、抓取錯(cuò)誤信息、完整步驟解析
文件上傳分為兩個(gè)部分,HTML顯示部分和PHP處理部分,HTML部分主要是讓用戶來(lái)選擇所要上傳的文件,然后通過(guò)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,才沒(méi)有錯(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 "上傳文件超過(guò)了PHP配置文件中upload_max_filesize選項(xiàng)的值";
break;
case 2:
echo "超過(guò)了表單MAX_FILE_SIZE的限制大小";
break;
case 3:
echo "文件部分被上傳";
break;
case 4:
echo "沒(méi)有選擇上傳文件";
break;
case 6:
echo "沒(méi)有找到臨時(shí)目錄";
break;
case 7:
case 8:
echo "系統(tǒng)錯(cuò)誤";
break;
}
}
?>
4.上傳文件限制
《客戶端限制:》
通過(guò)表單隱藏域限制上傳文件的最大值
<input type="hidden" name="MAX_FILE_SIZE" value="字節(jié)數(shù)">
通過(guò)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; //寫(xiě)最大的字節(jié)數(shù),自己算
$allowext=array('jpeg','jpg','pnd','gif','wbmp'); //定義一下允許的上傳文件類型
//1.判斷錯(cuò)誤號(hào)
if($fileinfo['error']==0)
{
//1.判斷上傳文件大小
if($fileinfo['size']>$maxsize)
{
exit('上傳文件過(guò)大');
}
//2.判斷上傳文件類型是不是在規(guī)定類型中
$ext=strtolower(end(explode(',',$fileinfo['name'])));//截取上傳文件擴(kuò)展名
if(!in_array($ext,$allowext)) // 判斷上傳文件的擴(kuò)展名是不是在定義類型中
{
exit('非法文件類型');
}
//3.判斷文件是否是通過(guò)HTTP POST方式上傳上來(lái)的
if(!is_uploaded_file($fileinfo['tmp_name']))
{
exit('文件不是通過(guò)HTTP POST方式上傳上來(lái)的');
}
//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; //通過(guò)MD5加密等措施給文件名取名
$destination=$path.'/'.$uniname;
if(move_uploaded_file($fileinfo['tmp_name'],$destination)) //上傳文件
{
echo "文件上傳成功";
}else
{
echo "文件上傳失敗";
}
}else
{
//匹配錯(cuò)誤信息
switch($error)
{
case 1:
echo "上傳文件超過(guò)了PHP配置文件中upload_max_filesize選項(xiàng)的值";
break;
case 2:
echo "超過(guò)了表單MAX_FILE_SIZE的限制大小";
break;
case 3:
echo "文件部分被上傳";
break;
case 4:
echo "沒(méi)有選擇上傳文件";
break;
case 6:
echo "沒(méi)有找到臨時(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"> //通過(guò)表單隱藏域限制上傳文件的最大值 <input type="hidden" name="MAX_FILE_SIZE" value="字節(jié)數(shù)"> //通過(guò)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; //寫(xiě)最大的字節(jié)數(shù),自己算
$allowext=array('jpeg','jpg','pnd','gif','wbmp'); //定義一下允許的上傳文件類型
//1.判斷錯(cuò)誤號(hào)
if($fileinfo['error']==0)
{
//1.判斷上傳文件大小
if($fileinfo['size']>$maxsize)
{
exit('上傳文件過(guò)大');
}
//2.判斷上傳文件類型是不是在規(guī)定類型中
$ext=strtolower(end(explode(',',$fileinfo['name'])));//截取上傳文件擴(kuò)展名
if(!in_array($ext,$allowext)) // 判斷上傳文件的擴(kuò)展名是不是在定義類型中
{
exit('非法文件類型');
}
//3.判斷文件是否是通過(guò)HTTP POST方式上傳上來(lái)的
if(!is_uploaded_file($fileinfo['tmp_name']))
{
exit('文件不是通過(guò)HTTP POST方式上傳上來(lái)的');
}
//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; //通過(guò)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 "上傳文件超過(guò)了PHP配置文件中upload_max_filesize選項(xiàng)的值";
break;
case 2:
echo "超過(guò)了表單MAX_FILE_SIZE的限制大小";
break;
case 3:
echo "文件部分被上傳";
break;
case 4:
echo "沒(méi)有選擇上傳文件";
break;
case 6:
echo "沒(méi)有找到臨時(shí)目錄";
break;
case 7:
case 8:
echo "系統(tǒng)錯(cuò)誤";
break;
}
}
?>
以上所述是小編給大家介紹的PHP文件上傳、客戶端和服務(wù)器端加限制、抓取錯(cuò)誤信息、完整步驟,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Yii查詢生成器(Query Builder)用法實(shí)例教程
這篇文章主要介紹了Yii查詢生成器(Query Builder)用法,包括了各種常見(jiàn)的查詢操作,需要的朋友可以參考下2014-09-09
PhpStorm連接服務(wù)器并實(shí)現(xiàn)自動(dòng)上傳功能
這篇文章主要介紹了PhpStorm連接服務(wù)器并實(shí)現(xiàn)自動(dòng)上傳功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
Yii2簡(jiǎn)單實(shí)現(xiàn)多語(yǔ)言配置的方法
這篇文章主要介紹了Yii2簡(jiǎn)單實(shí)現(xiàn)多語(yǔ)言配置的方法,涉及Yii配置文件的設(shè)置及語(yǔ)言包的操作方法,需要的朋友可以參考下2016-07-07
yii2使用GridView實(shí)現(xiàn)數(shù)據(jù)全選及批量刪除按鈕示例
本篇文章主要介紹了yii2使用GridView實(shí)現(xiàn)數(shù)據(jù)全選及批量刪除按鈕示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03
實(shí)例講解PHP設(shè)計(jì)模式編程中的簡(jiǎn)單工廠模式
這篇文章主要介紹了PHP設(shè)計(jì)模式編程中的簡(jiǎn)單工廠模式,舉了一個(gè)水果銷售和一個(gè)計(jì)算器設(shè)計(jì)的例子,需要的朋友可以參考下2016-02-02
Laravel框架實(shí)現(xiàn)多數(shù)據(jù)庫(kù)連接操作詳解
這篇文章主要介紹了Laravel框架實(shí)現(xiàn)多數(shù)據(jù)庫(kù)連接操作,結(jié)合實(shí)例形式詳細(xì)分析了Laravel框架連接2個(gè)數(shù)據(jù)庫(kù)的具體操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07

