1 / 56

伺服器端的檔案處理

伺服器端的檔案處理. 路徑符號 "/" 與 "" 的不同. Windows 中 , 路徑符號為反斜線 "", 例如 『c:www test.php 』 。 Unix / Linux 系統中 , 路徑符號則為一般的斜線 "/", 如 『/ tmp /test.txt』 。 由於 “” 使用上比較 麻煩 , 建議 使用 “/” 。 如 『c:/www/ test.php 』 或是 『../dir2/ test.php 』 。可避免 特殊 字元問題,程式也較具可 攜 性,可同時 在 Windows 與 Linux 系統上運作。.

more
Download Presentation

伺服器端的檔案處理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 伺服器端的檔案處理

  2. 路徑符號 "/" 與 "\" 的不同 • Windows 中, 路徑符號為反斜線 "\", 例如『c:\www\test.php』。 • Unix / Linux 系統中, 路徑符號則為一般的斜線 "/", 如『/tmp/test.txt』。 • 由於 “\” 使用上比較麻煩,建議使用 “/”。如『c:/www/test.php』或是 『../dir2/test.php』。可避免特殊字元問題,程式也較具可攜性,可同時在 Windows 與 Linux 系統上運作。

  3. 標準檔案存取 • 開啟檔案:$fh = fopen(檔案名稱, 開啟模式) • 讀取/寫入資料:使用相關函式, 透過檔案代碼讀寫資料。 • 關閉檔案:fclose($fh)

  4. 一次讀取一行資料 - fgets() • 語法:fgets($fh) • 範例: $str = ‘’; try{ $fh= fopen('/tmp/readfile.txt', "r"); if ( ! $fh) { throw new Exception(‘無法開啟檔案’); } while (!feof($fh)) { $contents = fgets($fh); $str= $str . $contents . “<br/>”; } fclose($fh); } catch(Exception $e){ echo $e->getMessage(); }

  5. 分割字串 - explode() • 將字串依分字元進行分割,並將結果以字串陣列傳回 • explode(delimiter, string) • delimiter: 分割字元 • string: 被分割的字串 • 範例:生日為 “71 / 12 / 03”,如果想各別取出年、月、日,便需要將這個字串進行分割。 • $birthday = “71/12/03”; • $birtharray = explode(“/”, $birthday); • 結果:{‘71’, ‘12’, ‘03’}

  6. 寫入檔案 - fputs() • 語法:fputs($fh, $string) • 範例: $fh= fopen('/tmp/readfile.txt', “w"); if ( ! $fh) { die(‘無法開啟檔案’); } if (fputs($fh, ‘高雄應用科技大學’)) { echo ‘成功寫入’; } else{ echo ‘寫入失敗’; } fclose($handle);

  7. 檔案與目錄屬性 • 檢查檔案與目錄的屬性 • 練習:訪客計數器

  8. 檔案與目錄列表 • 語法:scandir(directory, sorting_order) • directory: 要讀取的目錄 • sorting_order: 排序方式 • 不存在是升冪排序 • 1是降冪排序 • scandir()會取得 directory目錄下的檔案與子目錄名稱,並以陣列傳回。 • 範例 <?php header("content-type:text/html; charset=utf8"); $dirlist = scandir('/'); foreach($dirlist as $key => $name){ echo "\$dirlist[$key] = $name <br/>"; } ?>

  9. 檔案與目錄管理 • 切換目錄:chdir(directory) • Ex: chdir(‘/home’); • 複製檔案:copy(來源檔, 目的檔) • 重新命名檔案:rename(舊檔案名稱, 新檔案名稱) • 搬移檔案: rename(舊目錄/檔案, 新目錄/檔案) • 刪除檔案:unlink(檔案名稱) • 傳回目前目錄:getcwd()

  10. 檔案上傳的流程 • (1) 使用者透過上傳表單選擇要上傳的檔案, 然後送出檔案給伺服器。 • (2) 伺服器收到檔案後, 會將上傳的檔案儲存為暫存檔。 • (3) PHP 程式將暫存檔搬移到存放上傳檔案的目錄。 暫存檔 上傳表單 伺服器 目的位址

  11. 上傳表單 <form action=“upload.php” method=“post” enctype="multipart/form-data“> <input type=“file” name=“upFile”> <input type=“submit” value=“送出”> </form>

  12. 在 PHP 中取得暫存檔的資訊

  13. 處理上傳檔案 try{ if($_FILES['upFile']['error']!=UPLOAD_ERR_OK) throw new Exception('上傳失敗'); echo "上傳成功"; if(!move_uploaded_file($_FILES['upFile']['tmp_name'], realpath(".") . "/" . $_FILES['upFile']['name'])) throw new Exception('移動檔案失敗'); echo $_FILES['upFile']['name'] . "<br>"; echo $_FILES['upFile']['type'] . "<br>"; echo $_FILES['upFile']['size'] . "<br>"; echo $_FILES['upFile']['tmp_name'] . "<br>"; } catch (Exception $e){ echo $e->getMessage(); } • 確認目的位址是否具有寫入權,否則會有Permission denied的錯誤訊息,權限設定為757。

  14. 多檔案上傳 表單部份: <form action=“upload.php” method=“post” enctype="multipart/form-data“> <input type=“file” name=“upFile[]”> <input type=“file” name=“upFile[]”> <input type=“file” name=“upFile[]”> <input type=“submit” value=“送出”> </form>

  15. 檔案上傳的相關設定 • 在 php.ini 的設定中, 下面幾項和檔案上傳有關係: • file_uploads:預設值是『On』時, 允許用戶端用 HTTP 協定上傳檔案。 • upload_tmp_dir:上傳檔案暫存目錄, 在 wamp5 中, 此項目的預設值是 『c:/wamp/tmp』。 • upload_max_filesize:上傳檔案可允許的最大容量, 預設值是 2 (MB)。

  16. 檔案上傳的相關設定 • 實際運用時, 此設定值可能會太小, 您可視需要自行調整。 • max_execution_time:每個 PHP 程式執行時間的最大值, 預設值為 30 秒。 • 如果您允許用戶上傳比較大的檔案, 也建議放寬此設定值, 否則當執行時間達到最大值, 不論檔案是否上傳完成, 程式都會自動結束, 導致上傳失敗。 • 更改過 php.ini 的設定後, 請記得重新啟動 Apache 伺服器, 才能讓新設定生效。

  17. 檔案上傳的相關設定 • 除了 php.ini 的設定外, 用來儲存上傳檔案的上傳目錄必須開放適當的寫入權限, 否則程式可能無法儲存檔案。 • 通常在 Windows 中, 使用者皆可寫入大多數目錄, 所以沒有這樣的權限問題。 • 但是在 Linux 剛好相反, 大多數目錄都不允許非擁有者寫入, 此時必須用 chmod 指令設定適當的權限。

  18. 在上傳表單中設定檔案最大容量 • 要設定上傳檔案的最大容量, 除了利用 php.ini 中的 upload_max_filesize 之外, 也可以在表單中利用隱藏的 input 欄位設定。 • 要製作這樣的欄位, 必須設定下面 3 項屬性: • type = "hidden" • name = "MAX_FILE_SIZE" • value = "要設定的最大值"

  19. 在上傳表單中設定檔案最大容量 • 舉例來說, 下面的 input 欄位設定上傳檔案的最大限制為 10 M 位元: • 表單欄位與 php.ini 的 upload_max_filesize 兩種設定方式如果大小不同時, 會以較小的設定為準。

  20. 7 - 5 實戰演練 - 網站伺服器檔案總管 • 利用本章介紹的技巧, 可以撰寫一個簡易的網站伺服器檔案總管。 • 使用者可透過瀏覽器瀏覽或重新命名所有的子目錄, 也可對檔案進行刪除、複製與更名 3 種操作。

  21. 程式功能 • 我們要製作的網站伺服器檔案總管具有下列功能。 • 顯示目錄列表

  22. 程式功能 • 更改目錄或檔案名稱 • 在目錄列表中, 按目錄或檔案右邊的更名連結, 會出現如下表單以便更改檔案名稱:

  23. 程式功能

  24. 程式功能 • 複製檔案 • 按檔案右邊的複製連結可複製檔案:

  25. 程式功能 • 刪除檔案 • 按檔案右邊的刪除連結可刪除檔案:

  26. 程式功能 • 上傳檔案 • 按上傳檔案連結可以將檔案上傳到目前目錄:

  27. 程式功能

  28. 程式架構 • 檔案總管的架構如下:

  29. 程式架構 • 切換目錄、檔案複製 / 刪除 / 更名等操作, 都是利用 GET 傳遞的 op 參數來判斷: • 當使用者在各目錄間切換時, 我們會以 $_SESSION['cwd'] 記錄目前的目錄。

  30. 程式架構 • 然後使用下列兩個 Session 陣列儲存目前目錄下的子目錄與檔案: • 使用者切換目錄時, 會以 GET 的方式送出 "id = 2" 的參數, 程式讀取後, 便會切換到 $_SESSION['dirs'][2] 所記錄的子目錄。

  31. 程式架構 • 而檔案的複製、刪除、更名時, 也都會使用 id 參數來讀取目錄與檔案名稱。 • 之所以不採用直接送出目錄與檔案名稱的設計, 是為了避免使用者特意送出系統檔案的名稱, 而導致 PHP 執行了危害系統的檔案操作。

  32. 主程式 • 主程式 Ch07-11-1.php 負責顯示目錄列表、切換目錄, 以及複製、刪除檔案, 下面是主程式的原始碼:

  33. 主程式

  34. 主程式

  35. 主程式

  36. 主程式

  37. 主程式

  38. 主程式

  39. 主程式

  40. 主程式 • (A) 此處是禁止使用者離開網站根目錄。 • 我們使用 ereg() 函式, 判斷是否目前目錄是否以網站根目錄為開頭。

  41. 主程式 • ereg() 所進行的判斷如下 (假設網站根目錄為 "C:/wamp/www"): • 如果判斷為 FALSE, 表示已經離開網站根目錄, 立刻切換回網站根目錄, 禁止離開。

  42. showdir() 函式 • showdir() 函式用來顯示目前目錄的列表, 其原始碼如下:

  43. showdir() 函式

  44. showdir() 函式

  45. showdir() 函式

  46. showdir() 函式

  47. showdir() 函式

  48. showdir() 函式

  49. 檔案更名 • 檔案更名是由 Ch07-11-2.php 負責, 下面是其原始碼:

  50. 檔案更名

More Related