- php是以UNIX文件系統(tǒng)為模型的竖慧,因此在windows系統(tǒng)中我們只能獲得“file”疲吸,“dir”或者“unknown”三種文件類型。而在UNIX系統(tǒng)中狮惜,我們可以獲得“block”高诺,“char”,“dir”碾篡,“fifo”虱而,“file”,“l(fā)ink”七種類型
filetype() --此函數(shù)可以判斷文件類型
常用的文件屬性處理函數(shù)
file_exists() --檢查目錄或文件是否存在
filesize() --取得文件大小开泽,返回的是字節(jié)數(shù)
is_readable() --判斷給定的文件是否可讀
is_writable() --判斷給定的文件是否可寫
is_executable() --判斷給定的文件是否可執(zhí)行
filectime() --獲取文件的創(chuàng)建時(shí)間
filemtime() --獲取文件的修改時(shí)間
fileatime() --獲取文件的訪問時(shí)間
stat() --獲取文件的大部分屬性牡拇,返回?cái)?shù)組
1.目錄的基本操作
在windows中默認(rèn)使用“\”作為路徑分隔符
在UNIX系統(tǒng)中使用“/”作為路徑分隔符
當(dāng)然windows也接受使用“/”作為分隔符,所以為了程序的可移植性穆律,建議都使用“/”作為分隔符惠呼,另外PHP的內(nèi)置常量DIRECTORY_SEPARTOR,其值為當(dāng)前系統(tǒng)的默認(rèn)文件路徑分隔符。
basename() --返回路徑中的文件名部分
dirname() --返回路徑中的目錄部分峦耘,和樓上相反
pathinfo() --返回一個(gè)關(guān)聯(lián)數(shù)組其中包括指定路徑中的目錄名剔蹋、基本名和擴(kuò)展名三個(gè)部分
建立和刪除目錄
mkdir() --建立一個(gè)新目錄
rmdir() --只能刪除一個(gè)空目錄
unlink() --刪除一個(gè)文件
可以自定義一個(gè)函數(shù)使用遞歸方法刪除一個(gè)非空目錄
function delDir($directory){
if (file_exists($directory)) {
if ($dir_handle = @opendir($directory)) {
while ($filename = readdir($dir_handle)) {
if ($filename != "." && $filename != "..") {
$subFile = $directory.'/'.$filename;
if (is_dir($subFile))
delDir($subFile);
if (is_file($subFile))
unlink($subFile);
}
}
closedir($dir_handle);
rmdir($directory);
}
}
}
統(tǒng)計(jì)目錄大小
自定義函數(shù)使用遞歸方法
function dirSize($directory) {
$dir_size = 0;
if ($dir_handle = @opendir($directory)) {
while ($filename = readdir($dir_handle)) {
if ($filename != '.' && $filename != '..') {
$subFile = $directory.'/'.$filename;
if (is_dir($subFile))
$dir_size += dirSize($subFile);
if (is_file($subFile))
$dir_size += filesize($subFile);
}
}
closedir($dir_handle);
return $dir_size;
}
}
2.文件的基本操作
基本的操作函數(shù)
fclose() --關(guān)閉已打開的文件資源
fopen() --打開一個(gè)文件,第一個(gè)參數(shù)需要被打開文件的URL辅髓, 第二個(gè)參數(shù)需要提供文件模式
copy(來源文件泣崩,目的文件) --復(fù)制文件
unlink(目標(biāo)文件) --刪除文件
ftruncate(目標(biāo)文件資源,截取長度) --將文件截取到指定的長度
rename(舊文件名洛口,新文件名) --重命名文件名或者目錄
文件模式如下:
模式字符 | 描述 |
---|---|
r | 只讀矫付,從文件開頭 |
r+ | 讀寫,從文件開頭 |
w | 只寫第焰,從文件開頭技即,如果文件存在,清空文件內(nèi)容 |
w+ | 讀寫樟遣,從文件開頭而叼,如果文件存在,清空文件內(nèi)容 |
x | 創(chuàng)建并以寫入方式打開豹悬,從文件開頭葵陵。如果文件存在返回false,僅用于本地文件 |
x+ | 創(chuàng)建并以讀寫方式打開瞻佛,從文件開頭脱篙。如果文件存在返回false,僅用于本地文件 |
a | 只寫伤柄,從文件末尾追加 |
a+ | 讀寫绊困,從文件末尾追加 |
b | 二進(jìn)制模式打開,用于與其他模式進(jìn)行連接 |
t | 文本模式打開文件 |
文件寫入
fwrite(resource handle,string string[,int length]) --執(zhí)行后返回寫入的字符數(shù)
file_put_contents() --直接將數(shù)據(jù)寫入指定的文件中适刀,不過會(huì)清空之前的內(nèi)容
讀取文件內(nèi)容
fread() --讀取打開的文件秤朗,第二個(gè)參數(shù)可設(shè)置讀取多少字節(jié)
file_get_contents --將文件讀入到字符串
fgets() --從打開的文件中返回一行
fgetc() --從打開的文件中返回字符串
readfile() --讀取一個(gè)文件,并輸出到輸出緩沖
移動(dòng)文件指針
ftell() --返回文件指針到當(dāng)前位置
fseek() --移動(dòng)文件指針到指定位置
rewind() --移動(dòng)文件指針到文件的開頭
使用這些函數(shù)時(shí)笔喉,必須提供一個(gè)用fopen打開的取视,合法的文件指針。
函數(shù)ftell()獲取文件當(dāng)前位置的指針偏移量常挚;
函數(shù)rewind()將文件指針移回到文件的開頭作谭;
而函數(shù)fseek()則將指針移動(dòng)到第二個(gè)參數(shù)offset指定的位置,如果沒有提供第三個(gè)參數(shù)whence奄毡,
則位置將設(shè)定為從文件開頭的offset字節(jié)處折欠。否則,第三個(gè)參數(shù)whence可以設(shè)置為三個(gè)可能的值吼过,
它將影響指針的位置锐秦。
文件的鎖定機(jī)制
在PHP中提供了flock() 函數(shù),可以對(duì)文件使用鎖定機(jī)制那先。當(dāng)一個(gè)進(jìn)程在訪問文件時(shí)加上鎖农猬,其他進(jìn)程想要對(duì)該文件進(jìn)行訪問,則必須等到鎖定被釋放之后售淡,這樣就可以避免在并發(fā)訪問同一個(gè)文件時(shí)破壞數(shù)據(jù)斤葱。
bool flock( int handle, int operation [,int &wouldblock] ) --輕便的咨詢文件鎖定
第一個(gè)函數(shù)必須是一個(gè)已經(jīng)打開的文件資源,
第二個(gè)參數(shù)operation也是必須的揖闸,規(guī)定使用哪種鎖定類型揍堕。operation可以是以下值之一:
>LOCK_SH取得共享鎖定(從文件中讀取數(shù)據(jù)時(shí)使用)
>LOCK_EX取得獨(dú)占鎖定(從文件中寫入數(shù)據(jù)時(shí)使用)
>LOCK_UN釋放鎖定(無論共享或獨(dú)占鎖,都用它釋放)
>LOCK_NB附加鎖定(如果不希望flock()在鎖定時(shí)堵塞汤纸,則應(yīng)在上述鎖定后加上該鎖)
如果鎖定會(huì)堵塞的話(已經(jīng)被flock()鎖定的文件衩茸,再次鎖定時(shí),flock()函數(shù)會(huì)被掛起贮泞,
這時(shí)稱為鎖定堵塞)楞慈,也可以將選定的第三個(gè)參數(shù)設(shè)置為1幔烛,則當(dāng)進(jìn)行鎖定時(shí)會(huì)阻擋其他進(jìn)程。
文件的上傳和下載
文件上傳
- 客戶端上傳設(shè)置
文件上傳的最基本方式是使用html表單選擇本地文件進(jìn)行提交囊蓝,在form表單中可以通過<input type="file">標(biāo)記選擇本地文件饿悬。如果文件支持上傳操作,必須在<form>標(biāo)簽中將enctype和method兩個(gè)屬性指明相應(yīng)的值聚霜,如下所示:
<html>
<head>
<meta charset="utf-8">
<title>文件上傳</title>
</head>
<body>
<form class="" action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
選擇文件:<input type="file" name="myfile">
<input type="submit" name="" value="上傳文件">
</form>
</body>
</html>
- 在服務(wù)器端通過PHP處理上傳
上傳文件接收和后續(xù)處理就要通過php來處理狡恬。想要通過php成功的管理文件上傳。需要通過以下三方面信息蝎宇。如下所示:》 設(shè)置PHP配置文件中的指令: 用于精細(xì)的調(diào)節(jié)PHP的文件上傳功能弟劲。
》$_FILES多維數(shù)組: 用于儲(chǔ)存各種與上傳文件相關(guān)的信息,其他數(shù)據(jù)還使用$_POST去接收姥芥。
》PHP的文件上傳處理函數(shù):用于上傳文件的后續(xù)處理兔乞。
PHP配置文件中與文件上傳有關(guān)的選項(xiàng)
指令名 | 默認(rèn)值 | 功能描述 |
---|---|---|
file_uploads | ON | 確定PHP腳本是否接收HTTP文件上傳 |
upload_max_filesize | 2M | 限制PHP處理上傳文件大小的最大值,此值必須小于post_max_size值 |
post_max_size | 8M | 限制通過POST方法可以接受信息的最大值撇眯,此值應(yīng)當(dāng)大于配置指令upload_max_file的值报嵌,因?yàn)槌松蟼鞯奈募猓€可能傳遞其他的表單域 |
upload_tmp_dir | NULL | 上傳文件存放的臨時(shí)路徑熊榛,可以是一個(gè)絕對(duì)路徑锚国。 |
全局?jǐn)?shù)組$_FILES中的元素說明
數(shù)組 | 描述 |
---|---|
$FILES["myfile"]["name"] | 客戶端機(jī)器文件的原名稱,包含擴(kuò)展名 |
$FILES["myfile"]["size"] | 已上傳文件的大小玄坦,單位是字節(jié) |
$FILES["myfile"]["tmp_name"] | 文件被上傳后血筑,在臨時(shí)目錄中的文件名 |
$FILES["myfile"]["error"] | ● 0 - 表示沒有任何錯(cuò)誤,文件上傳成功煎楣; ● 1 -表示 大小超過了配置文件中upload_max_filesize選項(xiàng)限制的值豺总; ● 2 -表示上傳文件大小超過了HTML表單設(shè)置的最大值; ● 3 -文件只有部分被上傳择懂; ● 4 -沒有上傳任何文件 |
$FILES["myfile"]["error"] | 獲取上傳文件的類型喻喳,比如是圖片,視頻困曙,等等 |
上表中$_FILES數(shù)組的第一維“myfile”表伦,代表的是上傳表單元素(<input type="file" name="myfile">)中的name屬性的值,另外php還有兩個(gè)專門用于文件上傳所使用的函數(shù)
is_uploaded_file(string filename) //判斷指定的文件是否是通過HTTP POST上傳的慷丽,函數(shù)的參數(shù)必須是指定類似于$FILES["myfile"]["tmp_name"] 的變量蹦哼,才能判斷指定的文件缺失是上傳文件
move_uploaded_file() //將上傳的文件移動(dòng)到新位置,雖然函數(shù)copy()和函數(shù)move() 同樣好用要糊,但是move_uploaded_file() 提供了一種額外的功能纲熏,就是判斷第一個(gè)參數(shù)filename指定的文件,是否是合法的上傳文件。如果不是則不會(huì)移動(dòng)文件并且返回false
文件下載
簡單的下載就像這樣:
<a >下載文件</a>
一行代碼直接搞定局劲,
當(dāng)然勺拣,為了提高安全性,當(dāng)然要逼格高一點(diǎn)類似下面這樣
header('Content-Type:image/gif;);
header('Content-Disposition:attachment;filename="test.gif"');
header('Content-Length:3390');