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

文件和目錄

文件權(quán)限

在 PHP 腳本得到通過(guò) Web 服務(wù)器運(yùn)行時(shí),會(huì)視為一個(gè)不同的服務(wù)器用戶(hù),然后 PHP 和 web 服務(wù)器都能夠讀取上傳的文件,但是 PHP 無(wú)法修改這些文件

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

寫(xiě)入文件

PHP5 中的函數(shù):

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

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

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

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

在向文件或者目錄寫(xiě)入數(shù)據(jù)的時(shí)候,需要調(diào)用 is_writable 來(lái)避免權(quán)限錯(cuò)誤

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

鎖定文件

當(dāng)多個(gè) PHP 腳本試圖同一時(shí)刻寫(xiě)入一個(gè)文件時(shí),就會(huì)出現(xiàn)問(wèn)題

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

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

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

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

在 fclose 的時(shí)候,文件會(huì)自動(dòng)解鎖,最好在寫(xiě)入完成的時(shí)候加上解鎖的語(yǔ)句

讀取文件

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

fgets 和 C 語(yǔ)法一樣:

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

處理文件上傳

處理文件上傳必須:

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

在 PHP 中,$_FILES 變量包含 5 個(gè)元素:

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

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