鍍金池/ 教程/ PHP/ 文件和目錄
使用數(shù)組
使用數(shù)值
cookie 和 session
數(shù)據(jù)庫介紹
總結
使用字符串
創(chuàng)建函數(shù)
變量
文件和目錄
控制結構
HTML 表單和 PHP
PHP 概述
創(chuàng)建 Web 應用程序

文件和目錄

文件權限

在 PHP 腳本得到通過 Web 服務器運行時,會視為一個不同的服務器用戶,然后 PHP 和 web 服務器都能夠讀取上傳的文件,但是 PHP 無法修改這些文件

Web 瀏覽器可以訪問 Web 根目錄及其子目錄的所有文件,但是不能訪問 Web 根目錄外面的目錄,所以,在創(chuàng)建可寫和目錄的時候,放在 Web 根目錄之外更安全

寫入文件

PHP5 中的函數(shù):

    file_put_contents($file, $data, FILE_APPEND)
    //打開文件并寫入數(shù)據(jù),向文件追加數(shù)據(jù)

    file_put_contents($file, $_POST['quote'] . PHP_EOL,FILE_APPEND);
    //PHP_EOL是表示當前操作系統(tǒng)的換行符

如果不是 PHP5,則需要使用舊的方法:

    $fp = fopen($file, mode);
    fwrite($fp, $data . PHP_EOL);
    fclose($fp);

在向文件或者目錄寫入數(shù)據(jù)的時候,需要調用 is_writable 來避免權限錯誤

    if( is_writable($file))
    //返回布爾值 表示指定文件是否可以被寫入

鎖定文件

當多個 PHP 腳本試圖同一時刻寫入一個文件時,就會出現(xiàn)問題

在 PHP5.1 以上版本可以這樣:

     file_put_contents($file, $data, FILE_APPEND | LOCK_EX)
     //LOCK_EX 是表示暫時鎖定該文件

在早期的 PHP 版本中,需要使用:

    flock($fp,locktype)
    //LOCK_SH  讀取共享鎖
      LOCK_EX  寫入獨享鎖
      LOCK_UN  釋放一個鎖
      LOCL_NB  非阻塞鎖

在 fclose 的時候,文件會自動解鎖,最好在寫入完成的時候加上解鎖的語句

讀取文件

  • file_get_contents 所有內(nèi)容讀到一個字符串中
  • file 每行一些數(shù)據(jù) 讀取之后放在一個數(shù)組中
  • fgets 返回具有指定長度的字符串

fgets 和 C 語法一樣:

    $fp = fopen($file, 'rb');
    while (!feof($fp))
    {
       $string = fgets($fp, 1024); //返回1023字節(jié)數(shù)據(jù)
    }
    fclose ($fp);

處理文件上傳

處理文件上傳必須:

  • 初始 form 標簽時必須包含代碼 enctype="multipart/form-data",表單必須使用 POST
  • 必須添加一個特殊的隱藏輸入框 用來建議瀏覽器最大能夠上傳的文件大小
  • 使用 file 元素創(chuàng)建所需要的表單字段

在 PHP 中,$_FILES 變量包含 5 個元素:

  • name 文件名
  • type MIME類型
  • size 文件大小(字節(jié))
  • tmp_name 文件存放在服務器上的臨時文件名
  • error 如果發(fā)生錯誤,保存的錯誤代碼

從安全角度,最好重命名上傳的文件,要完成這一任務,需要設計一個系統(tǒng),能夠生成一個新的唯一的文件名,并在一個文本文件或數(shù)據(jù)庫中同時保存原始文件名和新文件名。