560 likes | 668 Views
伺服器端的檔案處理. 路徑符號 "/" 與 "" 的不同. Windows 中 , 路徑符號為反斜線 "", 例如 『c:www test.php 』 。 Unix / Linux 系統中 , 路徑符號則為一般的斜線 "/", 如 『/ tmp /test.txt』 。 由於 “” 使用上比較 麻煩 , 建議 使用 “/” 。 如 『c:/www/ test.php 』 或是 『../dir2/ test.php 』 。可避免 特殊 字元問題,程式也較具可 攜 性,可同時 在 Windows 與 Linux 系統上運作。.
E N D
路徑符號 "/" 與 "\" 的不同 • Windows 中, 路徑符號為反斜線 "\", 例如『c:\www\test.php』。 • Unix / Linux 系統中, 路徑符號則為一般的斜線 "/", 如『/tmp/test.txt』。 • 由於 “\” 使用上比較麻煩,建議使用 “/”。如『c:/www/test.php』或是 『../dir2/test.php』。可避免特殊字元問題,程式也較具可攜性,可同時在 Windows 與 Linux 系統上運作。
標準檔案存取 • 開啟檔案:$fh = fopen(檔案名稱, 開啟模式) • 讀取/寫入資料:使用相關函式, 透過檔案代碼讀寫資料。 • 關閉檔案:fclose($fh)
一次讀取一行資料 - 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(); }
分割字串 - explode() • 將字串依分字元進行分割,並將結果以字串陣列傳回 • explode(delimiter, string) • delimiter: 分割字元 • string: 被分割的字串 • 範例:生日為 “71 / 12 / 03”,如果想各別取出年、月、日,便需要將這個字串進行分割。 • $birthday = “71/12/03”; • $birtharray = explode(“/”, $birthday); • 結果:{‘71’, ‘12’, ‘03’}
寫入檔案 - fputs() • 語法:fputs($fh, $string) • 範例: $fh= fopen('/tmp/readfile.txt', “w"); if ( ! $fh) { die(‘無法開啟檔案’); } if (fputs($fh, ‘高雄應用科技大學’)) { echo ‘成功寫入’; } else{ echo ‘寫入失敗’; } fclose($handle);
檔案與目錄屬性 • 檢查檔案與目錄的屬性 • 練習:訪客計數器
檔案與目錄列表 • 語法: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/>"; } ?>
檔案與目錄管理 • 切換目錄:chdir(directory) • Ex: chdir(‘/home’); • 複製檔案:copy(來源檔, 目的檔) • 重新命名檔案:rename(舊檔案名稱, 新檔案名稱) • 搬移檔案: rename(舊目錄/檔案, 新目錄/檔案) • 刪除檔案:unlink(檔案名稱) • 傳回目前目錄:getcwd()
檔案上傳的流程 • (1) 使用者透過上傳表單選擇要上傳的檔案, 然後送出檔案給伺服器。 • (2) 伺服器收到檔案後, 會將上傳的檔案儲存為暫存檔。 • (3) PHP 程式將暫存檔搬移到存放上傳檔案的目錄。 暫存檔 上傳表單 伺服器 目的位址
上傳表單 <form action=“upload.php” method=“post” enctype="multipart/form-data“> <input type=“file” name=“upFile”> <input type=“submit” value=“送出”> </form>
處理上傳檔案 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。
多檔案上傳 表單部份: <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>
檔案上傳的相關設定 • 在 php.ini 的設定中, 下面幾項和檔案上傳有關係: • file_uploads:預設值是『On』時, 允許用戶端用 HTTP 協定上傳檔案。 • upload_tmp_dir:上傳檔案暫存目錄, 在 wamp5 中, 此項目的預設值是 『c:/wamp/tmp』。 • upload_max_filesize:上傳檔案可允許的最大容量, 預設值是 2 (MB)。
檔案上傳的相關設定 • 實際運用時, 此設定值可能會太小, 您可視需要自行調整。 • max_execution_time:每個 PHP 程式執行時間的最大值, 預設值為 30 秒。 • 如果您允許用戶上傳比較大的檔案, 也建議放寬此設定值, 否則當執行時間達到最大值, 不論檔案是否上傳完成, 程式都會自動結束, 導致上傳失敗。 • 更改過 php.ini 的設定後, 請記得重新啟動 Apache 伺服器, 才能讓新設定生效。
檔案上傳的相關設定 • 除了 php.ini 的設定外, 用來儲存上傳檔案的上傳目錄必須開放適當的寫入權限, 否則程式可能無法儲存檔案。 • 通常在 Windows 中, 使用者皆可寫入大多數目錄, 所以沒有這樣的權限問題。 • 但是在 Linux 剛好相反, 大多數目錄都不允許非擁有者寫入, 此時必須用 chmod 指令設定適當的權限。
在上傳表單中設定檔案最大容量 • 要設定上傳檔案的最大容量, 除了利用 php.ini 中的 upload_max_filesize 之外, 也可以在表單中利用隱藏的 input 欄位設定。 • 要製作這樣的欄位, 必須設定下面 3 項屬性: • type = "hidden" • name = "MAX_FILE_SIZE" • value = "要設定的最大值"
在上傳表單中設定檔案最大容量 • 舉例來說, 下面的 input 欄位設定上傳檔案的最大限制為 10 M 位元: • 表單欄位與 php.ini 的 upload_max_filesize 兩種設定方式如果大小不同時, 會以較小的設定為準。
7 - 5 實戰演練 - 網站伺服器檔案總管 • 利用本章介紹的技巧, 可以撰寫一個簡易的網站伺服器檔案總管。 • 使用者可透過瀏覽器瀏覽或重新命名所有的子目錄, 也可對檔案進行刪除、複製與更名 3 種操作。
程式功能 • 我們要製作的網站伺服器檔案總管具有下列功能。 • 顯示目錄列表
程式功能 • 更改目錄或檔案名稱 • 在目錄列表中, 按目錄或檔案右邊的更名連結, 會出現如下表單以便更改檔案名稱:
程式功能 • 複製檔案 • 按檔案右邊的複製連結可複製檔案:
程式功能 • 刪除檔案 • 按檔案右邊的刪除連結可刪除檔案:
程式功能 • 上傳檔案 • 按上傳檔案連結可以將檔案上傳到目前目錄:
程式架構 • 檔案總管的架構如下:
程式架構 • 切換目錄、檔案複製 / 刪除 / 更名等操作, 都是利用 GET 傳遞的 op 參數來判斷: • 當使用者在各目錄間切換時, 我們會以 $_SESSION['cwd'] 記錄目前的目錄。
程式架構 • 然後使用下列兩個 Session 陣列儲存目前目錄下的子目錄與檔案: • 使用者切換目錄時, 會以 GET 的方式送出 "id = 2" 的參數, 程式讀取後, 便會切換到 $_SESSION['dirs'][2] 所記錄的子目錄。
程式架構 • 而檔案的複製、刪除、更名時, 也都會使用 id 參數來讀取目錄與檔案名稱。 • 之所以不採用直接送出目錄與檔案名稱的設計, 是為了避免使用者特意送出系統檔案的名稱, 而導致 PHP 執行了危害系統的檔案操作。
主程式 • 主程式 Ch07-11-1.php 負責顯示目錄列表、切換目錄, 以及複製、刪除檔案, 下面是主程式的原始碼:
主程式 • (A) 此處是禁止使用者離開網站根目錄。 • 我們使用 ereg() 函式, 判斷是否目前目錄是否以網站根目錄為開頭。
主程式 • ereg() 所進行的判斷如下 (假設網站根目錄為 "C:/wamp/www"): • 如果判斷為 FALSE, 表示已經離開網站根目錄, 立刻切換回網站根目錄, 禁止離開。
showdir() 函式 • showdir() 函式用來顯示目前目錄的列表, 其原始碼如下:
檔案更名 • 檔案更名是由 Ch07-11-2.php 負責, 下面是其原始碼: