在 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 根目錄之外更安全
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ǔ)句
fgets 和 C 語(yǔ)法一樣:
$fp = fopen($file, 'rb');
while (!feof($fp))
{
$string = fgets($fp, 1024); //返回1023字節(jié)數(shù)據(jù)
}
fclose ($fp);
處理文件上傳必須:
enctype="multipart/form-data"
,表單必須使用 POST 在 PHP 中,$_FILES 變量包含 5 個(gè)元素:
從安全角度,最好重命名上傳的文件,要完成這一任務(wù),需要設(shè)計(jì)一個(gè)系統(tǒng),能夠生成一個(gè)新的唯一的文件名,并在一個(gè)文本文件或數(shù)據(jù)庫(kù)中同時(shí)保存原始文件名和新文件名。