在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來實現檔案上傳的,沒看過這部分的朋友可以參考一下。