12.4.2 文件上傳的處理
在服務(wù)器端通過(guò)PHP處理上傳
上傳文件的接收和處理是通過(guò)PHP腳本來(lái)處理的蚯舱,具體需要通過(guò)以下三個(gè)方面信息:
設(shè)置PHP配置文件中的指令:用于精細(xì)地調(diào)節(jié)PHP的文件上傳功能改化。
$_FILES多維數(shù)組:用于存儲(chǔ)各種與上傳文件有關(guān)的信息,其他數(shù)據(jù)還是使用$_POST獲取枉昏。
PHP的文件上傳處理函數(shù):用于上傳文件的后續(xù)處理陈肛。
存儲(chǔ)在$_FILES["myfile"]["error"]中的值
伴隨文件上傳時(shí)產(chǎn)生的錯(cuò)誤信息代碼是在PHP4.2.0版本中引入的,具體如下:
值為0:表示沒(méi)有發(fā)生任何錯(cuò)誤兄裂。
值為1:表示上傳文件的大小超出了約定值句旱。文件大小的最大值是在PHP配置文件中指定的阳藻,該指令是:upload_max_filesize。
值為2:表示上傳文件大小超出了HTML表單隱藏域?qū)傩缘腗AX_FILE_SIZE元素所指定的最大值谈撒。
值為3:表示文件只被部分上傳腥泥。
值為4:表示沒(méi)有上傳任何文件。
值為6:表示找不到臨時(shí)文件夾啃匿。PHP 4.3.10 和 PHP 5.0.3 引進(jìn)蛔外。
值為7:表示文件寫(xiě)入失敗。PHP 5.1.0 引進(jìn)溯乒。
錯(cuò)誤值對(duì)應(yīng)的常量
UPLOAD_ERR_OK : 對(duì)應(yīng)值0
UPLOAD_ERR_INI_SIZE : 對(duì)應(yīng)值1
UPLOAD_ERR_FORM_SIZE : 對(duì)應(yīng)值2
UPLOAD_ERR_PARTIAL : 對(duì)應(yīng)值3
UPLOAD_ERR_NO_FILE : 對(duì)應(yīng)值4
UPLOAD_ERR_NO_TMP_DIR : 對(duì)應(yīng)值6
UPLOAD_ERR_CANT_WRITE : 對(duì)應(yīng)值7
常見(jiàn)數(shù)據(jù)格式(MIME)
upload.html
<form action="upload.php" method="post" enctype="multipart/form-data" >
name: <input type="text" name="username" value="" /><br>
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
up pic: <input type="file" name="pic" value=""><br>
<input type="submit" value="upload" /><br>
</form>
test.php
<?php
header("Content-Type:text/html;charset=utf-8");
/*
Array
(
[pic] => Array
(
[name] => 195_4074_831a070561e20a0.jpg
[type] => image/jpeg
[tmp_name] => C:\wamp\tmp\php45.tmp
[error] => 0
[size] => 43274
)
)
* *
*
*
*/
//第一步: 判斷錯(cuò)誤
if($_FILES['pic']['error'] > 0) {
switch($_FILES['pic']['error']) {
case 1:
echo "表示上傳文件的大小超出了約定值夹厌。文件大小的最大值是在PHP配置文件中指定的,該指令是:upload_max_filesize<br>";
break;
case 2:
echo "表示上傳文件大小超出了HTML表單隱藏域?qū)傩缘腗AX_FILE_SIZE元素所指定的最大值1M<br>";
break;
case 3:
echo "表示文件只被部分上傳<br>";
break;
case 4:
echo "表示沒(méi)有上傳任何文件<br>";
break;
default:
echo "末知錯(cuò)誤<br>";
break;
}
exit;
}
//第二步: 判斷類(lèi)型
$arr = explode(".", basename($_FILES['pic']['name']));
$hz = array_pop($arr);
$allowtype =array("gif", "png", "jpg", "jpeg");
if(!in_array($hz, $allowtype)) {
echo "上傳的類(lèi)型不合法";
exit;
}
//第三步: 判斷大小
$maxsize= 1000000;
if($_FILES['pic']['size'] > $maxsize) {
echo "上傳的文件超過(guò)了裆悄,{$maxsize}字節(jié)!";
exit;
}
//第四步矛纹, 上傳后的文件名一定要設(shè)置
$tmpfile = $_FILES['pic']['tmp_name'];
$srcname = "./uploads/".date("YmdHis").rand(100, 999).".".$hz;
//將臨時(shí)目錄下的上傳的文件,復(fù)制到我指定目錄下光稼, 指定的名子就可以完成上傳
if( move_uploaded_file($tmpfile, $srcname) ) {
echo "上傳成功!";
}else{
echo "上傳失敗!";
}