開啟檔案
fopen() 函數用於在 PHP 中開啟檔案。
此函數的第一個參數含有要開啟的檔案的名稱,第二個參數規定了使用哪種模式來開啟檔案:
<html><body><?php$file=fopen("welcome.txt","r");?></body></html>
檔案可能通過下列模式來開啟:
r:唯讀。在檔案的開頭開始。
r+:讀/寫。在檔案的開頭開始。
w:唯寫。開啟並清空檔案的內容;如果檔案不存在,則建立新檔案。
w+:讀/寫。開啟並清空檔案的內容;如果檔案不存在,則建立新檔案。
a:追加。開啟並向檔案檔案的末端進行寫操作,如果檔案不存在,則建立新檔案。
a+:讀/追加。通過向檔案末端寫內容,來保持檔案內容。
x:唯寫。建立新檔案。如果檔案已存在,則返回 FALSE。
x+:讀/寫。建立新檔案。如果檔案已存在,則返回 FALSE 和一個錯誤。
注釋:如果 fopen() 無法開啟指定檔案,則返回 0 (false)。
例子
如果 fopen() 不能開啟指定的檔案,下面的例子會產生一段訊息:
<html><body><?php$file=fopen("welcome.txt","r") or exit("Unable to open file!");?></body></html>
關閉檔案
fclose() 函數用於關閉開啟的檔案。
<?php$file = fopen("test.txt","r");//some code to be executedfclose($file);?>
檢測 End-of-file
feof() 函數檢測是否已達到檔案的末端 (EOF)。
在迴圈遍曆未知長度的資料時,feof() 函數很有用。
注釋:在 w 、a 以及 x 模式,您無法讀取開啟的檔案!
if (feof($file)) echo "End of file";
逐行讀取檔案
fgets() 函數用於從檔案中逐行讀取檔案。
注釋:在調用該函數之後,檔案指標會移動到下一行。
例子
下面的例子逐行讀取檔案,直到檔案末端為止:
<?php$file = fopen("welcome.txt", "r") or exit("Unable to open file!");//Output a line of the file until the end is reachedwhile(!feof($file)) { echo fgets($file). "<br />"; }fclose($file);?>
逐字元讀取檔案
fgetc() 函數用於從檔案逐字元地讀取檔案。
注釋:在調用該函數之後,檔案指標會移動到下一個字元。
例子
下面的例子逐字元地讀取檔案,直到檔案末端為止:
<?php$file=fopen("welcome.txt","r") or exit("Unable to open file!");while (!feof($file)) { echo fgetc($file); }fclose($file);?>
上傳檔案主要是以下幾步:
1.建立一個檔案上傳表單
允許使用者從表單上傳檔案是非常有用的。
請看下面這個供上傳檔案的 HTML 表單:
<html><body><form action="upload_file.php" method="post"enctype="multipart/form-data"><label for="file">Filename:</label><input type="file" name="file" id="file" /><br /><input type="submit" name="submit" value="Submit" /></form></body></html>
<form> 標籤的 enctype 屬性規定了在提交表單時要使用哪種內容類型。
在表單需要位元據時,比如檔案內容,請使用 "multipart/form-data"。
<input> 標籤的 type="file" 屬性規定了應該把輸入作為檔案來處理。
舉例來說,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。
注意:允許使用者上傳檔案是一個巨大的安全風險。請僅僅允許可信的使用者執行檔案上傳操作。
效果:
2.建立上傳指令碼
"upload_file.php" 檔案含有供上傳檔案的代碼:
<?phpif ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; }else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; }?>
效果:
通過使用 PHP 的全域數組 $_FILES,你可以從客戶電腦向遠程伺服器上傳檔案。
第一個參數是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"。就像這樣:
- $_FILES["file"]["name"] - 被上傳檔案的名稱
- $_FILES["file"]["type"] - 被上傳檔案的類型
- $_FILES["file"]["size"] - 被上傳檔案的大小,以位元組計
- $_FILES["file"]["tmp_name"] - 儲存在伺服器的檔案的臨時副本的名稱
- $_FILES["file"]["error"] - 由檔案上傳導致的錯誤碼
這是一種非常簡單檔案上傳方式。基於安全方面的考慮,您應當增加有關什麼使用者有權上傳檔案的限制。
這裡的$_FILES是一個多維陣列。第一維是files檔案的數組,因為表單中的input的name(不是id或者其他)是file。第二維則是每個檔案的相關資料,包含了上面列出的種種屬性。
上傳限制
在這個指令碼中,我們增加了對檔案上傳的限制。使用者只能上傳 .gif 或 .jpeg 檔案,檔案大小必須小於 20 kb:
<?phpif ((($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/pjpeg"))&& ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } }else { echo "Invalid file"; }?>
注釋:對於 IE,識別 jpg 檔案的類型必須是 pjpeg,對於 FireFox,必須是 jpeg。
儲存被上傳的檔案
上面的例子在伺服器的 PHP 臨時檔案夾建立了一個被上傳檔案的臨時副本。
這個臨時的複製檔案會在指令碼結束時消失。要儲存被上傳的檔案,我們需要把它拷貝到另外的位置:
<?phpif ((($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/pjpeg"))&& ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } }else { echo "Invalid file"; }?>
上面的指令碼檢測了是否已存在此檔案,如果不存在,則把檔案拷貝到指定的檔案夾。
注釋:這個例子把檔案儲存到了名為 "upload" 的新檔案夾,該檔案夾要存在,如果沒有需要建立。
move_uploaded_file(file,newloc) 函數將上傳的檔案移動到新位置。
若成功,則返回 true,否則返回 false。
file 必需----規定要移動的檔案。newloc 必需----規定檔案的新位置。
在使用move_uploaded_file()函數時可能會遇類似如下錯誤:
Warning: move_uploaded_file(/dest/inat/ion.ext) [function.move-uploaded-file]: failed to open stream: No such file or directory in /upload/handler.php on line X
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/temp/file/name' to '/dest/inat/ion.ext' in /upload/handler.php on line X
一般不是 '/temp/file/name'...的錯誤,而可能是路徑'/dest/inat' 不存在. 如果真是這樣只要建立這個路徑,問題就解決了。
我還遇到這樣一個情況,路徑是正確的,但是用的是訪問路徑,而不是內部的檔案操作路徑導致檔案無法寫入。
還有就是要注意寫入的路徑開頭的部分不要再加“\”,如將“’uploads\’.$_FILES['userfile']['name']”寫成“’\uploads\’.$_FILES['userfile']['name']”。
總之,最先要檢查的就是要寫入的路徑,問題很有可能出在這裡。
但是即使如此,還是報錯了:
Warning: move_uploaded_file(upload/12.jpg) [function.move-uploaded-file]: failed to open stream: Permission denied inupload_file.php on line24
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/saetmp/928/xququer/1359821561_2429732845/phppSXyZ6' to 'upload/12.jpg' inupload_file.php on line24
這是一般是沒有許可權讀寫檔案夾的問題。