在之前的文章中,小白已經(jīng)幫大家搞定了文件上傳的關鍵技術掰烟。文件上傳搞定了,下面我們要做的就是要對上傳的文件進行操作扩灯,比如查看已經(jīng)上傳的文件信息媚赖、下載、刪除等操作珠插。
圖文 / 丁建雄
小白是單純?yōu)榕d趣而寫作的獨立創(chuàng)作人惧磺,如果您喜歡小白的文章,歡迎關注捻撑、交流磨隘、分享(引用請鏈接到本文)。
目錄文件交互簡介
所謂目錄文件交互顾患,指的是用戶對存放在服務器端的文件進行讀寫等權限的交互動作番捂。
為了維護服務器端的穩(wěn)定安全,這一動作在絕大多數(shù)情況下是只讀 權限的江解。
但是设预,由于一些特殊的用戶要求,我們可以部分地開放一些高級權限犁河。比如鳖枕,作為公司成員,我們需要每天提交匯報材料到服務器端桨螺,這樣就要求服務器給我們以寫 操作的權限宾符。
在上一篇PHP關于文件上傳的文章中,小白已經(jīng)跟大家詳細討論了文件上傳灭翔,也即寫操作的整個流程問題魏烫。
這篇文章將沿著上篇文章,繼續(xù)討論:如何將我們已經(jīng)上傳到服務器的文件在本地進行訪問操作肝箱,即讀取我們剛剛寫入的內(nèi)容 哄褒。
這里牽涉到的問題主要是列出服務器某個文件存放空間的內(nèi)容問題,并且可以實時更新與交互煌张。
如果你還不是很清楚读处,沒關系,看完下面的例子再來看上面的文字唱矛,就會清楚很多了罚舱。
列舉目錄代碼
/*listing*/
$current_dir='upload/';
$dir = opendir($current_dir);
echo '<p>Directory listing:</p><ul>';
while(false !== ( $file = readdir($dir)))
{
//strip out the two entries of . and ..
if($file != "." && $file != "..")
{
echo '<li><a href="upload/'.$file.'">'.$file.'</a></li>';
}
}
echo '</ul>';
closedir($dir);
這個是我能寫出的比較簡單的代碼了井辜,這個只是一個片段,包含了列舉目錄所需的全部要素管闷。
這里面用了PHP里的三個函數(shù) opendir(), readdir(), closedir()
從函數(shù)命名上看就清楚了粥脚,打開、讀取包个、關閉目錄刷允。
也就是說,我們這幾行代碼所做的工作就是先打開一個目錄碧囊,然后讀取目錄下的文件內(nèi)容树灶,最后關閉這個目錄。
大方向清楚了糯而,再來細看這段代碼:大家有沒有發(fā)現(xiàn) echo
部分有很多類似HTML標記的語言天通?比如這段:
echo '<p>Directory listing:</p><ul>';
對的,你沒有看錯熄驼,就是HTML標記語言像寒,原來HTML語言在PHP中也能編譯啊瓜贾!是的诺祸,這也是PHP這門語言的強大,既能完成邏輯語言的運算問題祭芦,又能完成標記語言的兼容性問題筷笨,這也是PHP被廣泛應用在網(wǎng)頁開發(fā)設計的原因之一。
細節(jié)&重點
打開和關閉沒啥好說的龟劲,這里最關鍵的點在于讀取這段奥秆,且看:
while(false !== ( $file = readdir($dir)))
{
//strip out the two entries of . and ..
if($file != "." && $file != "..")
{
echo '<li><a href="upload/'.$file.'">'.$file.'</a></li>';
}
}
讀取目錄文件,這快采用的是循環(huán)讀取咸灿,直到?jīng)]有文件為止(所有都讀完了,返回值為false)侮叮。
循環(huán)體內(nèi)部有一個判斷語句:
if($file != "." && $file != "..")
這個啥意思啊 "." ".."
避矢,這一個點啊代表當前目錄,兩個點代表上一級目錄囊榜。通過這個判斷語句的限制审胸,就可以限制用戶進行跨目錄的訪問,從而保證服務器的安全穩(wěn)定卸勺。
當然砂沛,小白也測試過去掉這個限制,服務器顯示的是無訪問權限曙求,就像這樣:
但是碍庵,小白這邊得提醒大家映企,雖然沒有訪問權限舵鳞,卻暴露了你的服務器文件夾結構要拂,這樣對于黑客而言是可以鉆漏洞的。
所以啊现柠,還是規(guī)規(guī)矩矩苹享,嚴格按照最安全的方式去設定双絮,麻煩一點沒關系,系統(tǒng)穩(wěn)定安全最重要得问。
其實說什么黑客囤攀,都是在玩服務器端的一些邏輯漏洞而已,雖然未知的漏洞我們無法去預計宫纬,但是已知的可能性風險還是要嚴格預防的焚挠,這也是一個好的網(wǎng)站所必需的。
而判斷語句里面的這個就是列舉代碼:
echo '<li><a href="upload/'.$file.'">'.$file.'</a></li>';
這里哪怔,我們可以創(chuàng)建對列舉項目的限制宣蔚,這里只是給出了文件名,并鏈接到了文件(也就是點進去可以打開文件)认境。
至于更多的操作胚委,比如:刪除、修改等操作叉信,均有具體的PHP函數(shù)對應亩冬,大家只需要添加適當?shù)陌粹o,對應相應的事件就可以了硼身。
舉個例子:刪除某個文件
unlink($file);
為這個事件添加一個觸發(fā)按鈕(使用input表單的方法硅急,如果不清楚的可以翻看我 上一篇文章 詳細介紹過的)。
好了佳遂,接著上一篇文件上傳营袜,貼上完整的 upload.php 的代碼:
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 2000000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
/*listing*/
$current_dir='upload/';
$dir = opendir($current_dir);
echo '<p>Directory listing:</p><ul>';
while(false !== ( $file = readdir($dir)))
{
//strip out the two entries of . and ..
if($file != "." && $file != "..")
{
echo '<li><a href="upload/'.$file.'">'.$file.'</a></li>';
}
}
echo '</ul>';
closedir($dir);
}
else
{
echo "Invalid file";
}
?>
得出來的效果是這樣的
你可以點進去,下載丑罪、預覽已經(jīng)上傳到服務器的文件荚板。
至于更多的權限功能,還得你自己去探索啦吩屹!
各位如果有什么問題跪另,歡迎在評論中互動留言~
End!