在PHP中,文件上傳一般是通過move_uploaded_file()來實現的。
bool move_uploaded_file ( string filename, string destination )本函數檢查並確保由 filename 指定的文件是合法的上傳文件(即通過 PHP 的 HTTP POST 上傳機制所上傳的)。如果文件合法,則將其移動為由 destination 指定的文件。
如果 filename 不是合法的上傳文件,不會出現任何操作,move_uploaded_file() 將返回 FALSE。
如果 filename 是合法的上傳文件,但出於某些原因無法移動,不會出現任何操作,move_uploaded_file() 將返回 FALSE。此外還會發出一條警告。
下面我們通過一個實例來說明PHP是如何實現文件上傳的。
test.php 的原文件
復制代碼 代碼如下:<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>網站文件上傳實例</title>
<!--
-->
</head>
<body>
<form enctype="multipart/form-data" action=action.php method=post>
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type=file name=upfile size=20>
<input type=submit value='上傳文件'>
</form>
</body>
</html>
MAX_FILE_SIZE 隱藏字段(單位為字節)必須放在文件輸入字段之前,其值為接收文件的最大尺寸。這是對浏覽器的一個建議,PHP 也會檢查此項。在浏覽器端可以簡單繞過此設置,因此不要指望用此特性來阻擋大文件。實際上,PHP 設置中的上傳文件最大值是不會失效的。但是最好還是在表單中加上此項目,因為它可以避免用戶在花時間等待上傳大文件之後才發現文件過大上傳失敗的麻煩。
注: 要確保文件上傳表單的屬性是 enctype="multipart/form-data",否則文件將無法上傳。
在處理上傳頁面中,上傳文件的信息是通過數組 $_FILES 來獲取的。我們假設文件上傳字段的名稱如上例所示,為 "upfile",則文件信息為:
$_FILES['upfile']['name']
上傳文件的原文件名。
$_FILES['upfile']['type']
文件的 MIME 類型,如果浏覽器提供此信息的話。一個例子是“image/gif”。不過此 MIME 類型在 PHP 端並不檢查,因此不要想當然認為有這個值。
$_FILES['upfile']['size']
上傳文件的大小,單位為字節。
$_FILES['upfile']['tmp_name']
文件上傳後在服務端儲存的臨時文件名。
$_FILES['upfile']['error']
和該文件上傳相關的錯誤代碼。
PHP 將隨文件信息數組一起返回一個對應的錯誤代碼。該代碼可以在文件上傳時生成的文件數組中的 error 字段中被找到。代碼如下:
UPLOAD_ERR_OK
其值為 0,文件上傳成功。
UPLOAD_ERR_INI_SIZE
其值為 1,上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值 ,默認值為2M。 如果要想上傳更大的,我們可以在php.ini裡查找 upload_max_filesize = 2M 修改後即可生效。
UPLOAD_ERR_FORM_SIZE
其值為 2,上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL
其值為 3,文件上傳不完全,只有部分被上傳。
UPLOAD_ERR_NO_FILE
其值為 4,文件上傳失敗。
UPLOAD_ERR_NO_TMP_DIR
其值為 6,找不到臨時文件夾。PHP 4.3.10 和 PHP 5.0.3 引進。
UPLOAD_ERR_CANT_WRITE
其值為 7,文件寫入失敗。PHP 5.1.0 引進。
注: 以上值在 PHP 4.3.0 之後變成了 PHP 常量。
action.php 的原代碼
<?
/**
歡迎光臨我們來我站交流學習經驗
*/
function getname($exname){
$dir = "tmp/";
$i=1;
if(!is_dir($dir)){
mkdir($dir,0777);
}
while(true){
if(!is_file($dir.$i.".".$exname)){
$name=$i.".".$exname;
break;
}
$i++;
}
return $dir.$name;
}
$exname=strtolower(substr($_FILES['upfile']['name'],(strrpos($_FILES['upfile']['name'],'.')+1)));
$uploadfile = getname($exname);
if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploadfile)) {
echo "<h2><font color=#ff0000>文件上傳成功!</font></h2><br><br>";
}else {
echo "<h2><font color=#ff0000>文件上傳失敗!</font></h2><br><br>";
}
echo "下面是文件上傳的一些信息:
<br><br>原文件名:".$_FILES['upfile']['name'] .
"<br><br>類型:" .$_FILES['upfile']['type'] .
"<br><br>臨時文件名:".$_FILES['upfile']['tmp_name'].
"<br><br>文件大小:".$_FILES['upfile']['size'] .
"<br><br>錯誤代碼:".$_FILES['upfile']['error'];
?>
一定要確保上傳後文件所在的文件夾的權限至為 777 ,這點在服務器上體現的特別明顯,有時我們編寫的上傳代碼沒有任何的錯誤,然而在網上卻無法實現上傳功能,原因就在這裡。
本文只是講了如何通過PHP來實現文件上傳的,沒看過這部分的朋友可以參考一下。