[PHP]進階教程:PHP中的檔案開啟、關閉與檔案上傳案例教程

來源:互聯網
上載者:User

開啟檔案
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

這是一般是沒有許可權讀寫檔案夾的問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.