Ch11 檔案存取 網頁程式設計
大綱 存取伺服器端的路徑 存取伺服器端的資料夾 存取伺服器端的檔案 讀取伺服器端的文字檔 寫入伺服器端的文字檔 2018/11/22
存取伺服器端的路徑 取得檔案名稱:basename() 函式可以用來取得指定路徑的檔案名稱,其語法如下 : 取得路徑資訊: pathinfo() 函式可以用來將指定路徑分割為路徑名稱dirname、檔案名稱basename及副檔名extension三個部分,其語法如下: 取得絕對路徑:realpath() 函式可以用來取得檔案的絕對路徑,其語法如下: basename(string path [, string suffix]) pathinfo(string path) realpath(string path) 2018/11/22
範例1: <?php $path = $_SERVER['PHP_SELF']; echo '目前網頁的路徑:' . $path .'<br>'; echo basename($path) . '<br>'; //顯示目前網頁的檔案名稱 echo basename($path, '.php') . '<br>'; //顯示目前網頁的檔案名稱 $pathInfo = pathinfo($path); echo '檔案所在的路徑名稱:' . $pathInfo['dirname'] . '<br>'; echo '檔案名稱:' . $pathInfo['basename'] . '<br>'; echo '檔案附檔名:' . $pathInfo['extension'] . '<br>'; $rePath = realpath(basename($path)); echo '目前檔案+絕對路徑:' . $rePath . '<br>'; $rePathInfo = pathinfo($rePath); echo '目前絕對路徑:' . $rePathInfo['dirname'] . '<br>'; ?> 2018/11/22
存取伺服器端的資料夾(1/4) 建立資料夾:mkdir() 函式可以用來建立資料夾,其語法如下: 例如: 例如: 取得目前工作資料夾: getcwd() 函式可以用來取得目前工作資料夾 切換目前工作資料夾: chdir() 函式可以用來將目前工作資料夾切換到其它資料夾 mkdir(string pathname [, int mode [, bool recursive]]) mkdir("C:\\myPHP\\pictures"); mkdir("C:\\myPHP\\pictures", NULL, TRUE); mkdir("pictures"); getcwd(); chdir(string directory) chdir("C:\"); mkdir("pictures"); 2018/11/22
存取伺服器端的資料夾(2/4) 刪除資料夾: rmdir() 函式可以用來刪除資料夾, 判斷路徑是否為資料夾: is_dir() 函式可以用來判斷路徑是否為資料夾 判斷資料夾是否存在: file_exists() 函式可以用來判斷資料夾是否存在, rmdir(string dirname) rmdir("C:\\myPHP\\pictures"); is_dir(string filename) file_exists(string filename) 2018/11/22
存取伺服器端的資料夾(3/4) 變更資料夾權限: chmod() 函式可以用來變更資料夾權限, 取得資料夾的父資料夾名稱:dirname() 函式可以用來取得資料夾的父資料夾名稱, 參數path為欲取得父資料夾名稱的資料夾,例如dirname("C:\\Windows\\system32\\drivers") 會傳回 "C:\Windows\system32“ chmod(string filename, int mode) dirname(string path) 2018/11/22
存取伺服器端的資料夾(4/4) 讀取資料夾所包含的檔案名稱及子資料夾名稱: scandir() 函式可以用來讀取資料夾所包含的檔案名稱及子資料夾名稱 scandir(string directory [, int sorting_order]) 2018/11/22
存取伺服器端的檔案(1/3) 判斷檔案是否存在: file_exists() 函式可以用來判斷檔案或資料夾是否存在 判斷指定的路徑是否為檔案: is_file() 函式可以用來判斷指定的路徑是否為檔案 file_exists(string filename) is_file(string filename) 2018/11/22
存取伺服器端的檔案(2/3) 複製檔案: copy() 函式可以用來複製檔案 刪除檔案: unlink() 函式可以用來刪除檔案 變更檔案名稱: rename() 函式可以用來變更檔案名稱或資料夾名稱 copy(string source, string dest) copy("C:\\php\\license.txt", "license (new).txt") unlink(string filename) rename(string oldname, string newname) rename("temp.php", "temp.bak"); 2018/11/22
存取伺服器端的檔案(3/3) 取得檔案屬性:下列函式可以用來取得檔案屬性。 fileatime(string filename) filectime(string filename) filemtime(string filename) filesize(string filename) is_readable(string filename) is_writable(string filename) 2018/11/22
讀取伺服器端的文字檔(1/3) 使用fread() 函式讀取文字檔:讀取文字檔的流程為「開啟檔案」→「讀取檔案」→「關閉檔案」 (nl2br函式是將參數中的換行符號,如\n,\r,\r\n,轉換為<br>) 2018/11/22
讀取伺服器端的文字檔(2/3) 使用fgets() 函式讀取文字檔:可以從檔案指標處讀取一行資料 2018/11/22
讀取伺服器端的文字檔(3/3) 使用file_get_contents() 函式讀取文字檔:無須經過開啟檔案及關閉檔案的動作即可讀取檔案全部內容 file_get_contents(string filename) 2018/11/22
寫入伺服器端的文字檔(1/3) 使用fwrite()、fputs() 函式寫入文字檔: fputs() 函式是fwrite() 函式的別名,兩者功能相同 fwrite(resource handle, string str [, int length]) fputs(resource handle, string str [, int length]) 2018/11/22
寫入伺服器端的文字檔(2/3) 2018/11/22
寫入伺服器端的文字檔(3/3) 使用file_put_contents() 函式寫入文字檔:無須經過開啟檔案及關閉檔案的動作即可將指定的內容寫入檔案 file_put_contents(string filename, string data) 2018/11/22
實作專題:檔案上傳 2018/11/22
Step 1: 設定php.ini 開啟?:\xwamp\php\php.ini組態設定檔,然後設定下列參數: file_uploads=On 允許經由HTTP通訊協定進行檔案上傳 upload_tmp_dir=??? 設定檔案下傳時所要使用的暫存目錄,如果沒有設定,會用os所設定的 upload_max_filesize=64M 原預設為2M,為了確保後續不會因上傳檔案過大而失敗 post_max_size=64M POST方式允許傳送的最大容量 max_input_time=100 上傳檔案所花費的時間若超過100秒,將會上傳失敗 2018/11/22
Step 2: 撰寫前端的檔案上傳介面 <form method="post" action="upload_01.php" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="1048576"> < input type="file" name="myfile" size="50"><br><br> < input type="submit" value="上傳"> < input type="reset" value="重新設定"> </form> 2018/11/22
Step 3:撰寫後端的處理程式 在瀏覽者選擇好要上傳的檔案並按 [上傳] 後,檔案就會被上傳至Web伺服器的暫存資料夾,暫存檔的名稱為phpxxx.tmp,xxx為流水號。 3-1 取得檔案資訊 後端的處理程式可以透過下列變數取得上傳檔案的資訊: $_FILES["欄位名稱"]["name"] $_FILES["欄位名稱"]["type"] $_FILES["欄位名稱"]["size"] $_FILES["欄位名稱"]["tmp_name'"] $_FILES["欄位名稱"]["error"] 3-2 移動檔案 接下來,我們可以使用move_uploaded_file() 函式將暫存檔案移至特定的資料夾,其語法如下: move_uploaded_file(string filename, string destination) 2018/11/22
範例2:上傳一個檔案 前端:(project1_page1.html) <body> <h1 align="center">檔案上傳</h1> <h5 align="center">歡迎使用檔案上傳服務,您可以一次上傳一個檔案</h5> <form method="post" action="Project1_upload.php" enctype="multipart/form-data"> <!-設定可上傳的檔案大小為1M=1048576 -> <input type="hidden" name="MAX_FILE_SIZE" value="1048576"> <input type="file" name="myfile" size="50"><br><br> <input type="submit" value="上傳"> <input type="reset" value="重新設定"> </form> </body> 2018/11/22
範例2:上傳一個檔案 後端:Project1_upload.php //指定檔案儲存目錄及檔名 $upload_dir = "./upload files/"; //iconv()函式是將檔名轉換為Big5編碼,可避免上傳中文檔名時,發生錯誤 $upload_file = $upload_dir . iconv("UTF-8", "Big5", $_FILES["myfile"]["name"]); //將上傳的檔案由暫存目錄移至指定之目錄 if(move_uploaded_file($_FILES["myfile"]["tmp_name"], $upload_file)) { echo "<strong>檔案上傳成功</strong><hr>"; //顯示檔案資訊 echo "檔案名稱:" . $_FILES["myfile"]["name"] . "<br>"; echo "暫存檔案:" . $_FILES["myfile"]["tmp_name"] . "<br>"; echo "檔案大小:" . $_FILES["myfile"]["size"] . "<br>"; echo "檔案種類:" . $_FILES["myfile"]["type"] . "<br>"; echo "<p><a href='javascript:history.back()'>繼續上傳</a></p>"; } else { echo "檔案上傳失敗(" . $_FILES["myfile"]["error"] . ")<br><br>"; echo "<a href='javascript:history.back()'>重新上傳</a>"; ?> 2018/11/22
範例3:上傳多個檔案 前端:(project2_page1.html) <body> <h1 align="center">檔案上傳</h1> <h5 align="center">歡迎使用檔案上傳服務,您可以一次上傳多個檔案</h5> <form method="post" action="Project2_upload.php" enctype="multipart/form-data"> <!-設定可上傳的檔案大小為1M=1048576 -> <input type="hidden" name="MAX_FILE_SIZE" value="1048576"> <input type="file" name="myfile[]" size="50"><br><br> <input type="submit" value="上傳"> <input type="reset" value="重新設定"> </form> </body> 2018/11/22
範例3:上傳多個檔案 後端:Project2_upload.php //指定檔案儲存目錄及檔名 $upload_dir = "./upload files/"; //計算上傳的檔案個數 $i = count($_FILES["myfile"]["name"]); for($j=0; $j <$i; $j++) { //iconv()函式是將檔名轉換為Big5編碼,可避免上傳中文檔名時,發生錯誤 $upload_file = $upload_dir . iconv("UTF-8", "Big5", $_FILES["myfile"]["name"][$j]); //將上傳的檔案由暫存目錄移至指定之目錄 if(move_uploaded_file($_FILES["myfile"]["tmp_name"][$j], $upload_file)) { echo "<strong>檔案上傳成功</strong><hr>"; //顯示檔案資訊 echo "檔案名稱:" . $_FILES["myfile"]["name"][$j] . "<br>"; echo "暫存檔案:" . $_FILES["myfile"]["tmp_name"][$j] . "<br>"; echo "檔案大小:" . $_FILES["myfile"]["size"][$j] . "<br>"; echo "檔案種類:" . $_FILES["myfile"]["type"][$j] . "<br>"; echo "上傳成功<hr>"; } else echo "檔案上傳失敗(" . $_FILES["myfile"]["error"][$j] . ")<br><br>"; echo "<p><a href='javascript:history.back()'>繼續上傳</a></p>"; ?> 2018/11/22
範例4:讀取+寫入檔案內容 Project3_page1.php <body> <h3 align="center">讀入檔案並編修</h3> <form method="post" action="project3_write.php" enctype="multipart/form-data"> <textarea name="contents" cols="50" rows="5"> <?php $filename = fopen("qq1.txt", "r+"); while($line = fgets($filename)) { echo $line; } fclose($filename); ?> </textarea> <input type="submit" value="存檔"> <input type="reset" value="重新設定"> </form> </body> 2018/11/22
範例4:讀取+寫入檔案內容 Project3_write.php $filename = fopen("qq1.txt", "w+"); if(flock($filename, LOCK_EX|LOCK_NB)) { //$result = nl2br($_POST["contents"]); //$result = str_replace(chr(13).chr(10), "<br>",$_POST["contents"]); $result = $_POST["contents"]; fwrite($filename, $result); flock($filename, LOCK_UN); } else echo "錯誤!檔案已被他人使用中"; fclose($filename); echo "<p><a href='javascript:history.back()'>回上一頁</a></p>"; ?> 2018/11/22