在之前的文章中,小白已經幫大家搞定了文件上傳的關鍵技術。文件上傳搞定了,下面我們要做的就是要對上傳的文件進行操作,比如查看已經上傳的文件信息、下載、刪除等操作。
圖文 / 丁建雄
小白是單純為興趣而寫作的獨立創作人,如果您喜歡小白的文章,歡迎關注、交流、分享(引用請鏈接到本文)。
目錄文件交互簡介
所謂目錄文件交互,指的是用戶對存放在服務器端的文件進行讀寫等權限的交互動作。
為了維護服務器端的穩定安全,這一動作在絕大多數情況下是只讀 權限的。
但是,由于一些特殊的用戶要求,我們可以部分地開放一些高級權限。比如,作為公司成員,我們需要每天提交匯報材料到服務器端,這樣就要求服務器給我們以寫 操作的權限。
在上一篇PHP關于文件上傳的文章中,小白已經跟大家詳細討論了文件上傳,也即寫操作的整個流程問題。
這篇文章將沿著上篇文章,繼續討論:如何將我們已經上傳到服務器的文件在本地進行訪問操作,即讀取我們剛剛寫入的內容 。
這里牽涉到的問題主要是列出服務器某個文件存放空間的內容問題,并且可以實時更新與交互。
如果你還不是很清楚,沒關系,看完下面的例子再來看上面的文字,就會清楚很多了。
列舉目錄代碼
/*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里的三個函數 opendir(), readdir(), closedir()
從函數命名上看就清楚了,打開、讀取、關閉目錄。
也就是說,我們這幾行代碼所做的工作就是先打開一個目錄,然后讀取目錄下的文件內容,最后關閉這個目錄。
大方向清楚了,再來細看這段代碼:大家有沒有發現 echo
部分有很多類似HTML標記的語言?比如這段:
echo '<p>Directory listing:</p><ul>';
對的,你沒有看錯,就是HTML標記語言,原來HTML語言在PHP中也能編譯啊!是的,這也是PHP這門語言的強大,既能完成邏輯語言的運算問題,又能完成標記語言的兼容性問題,這也是PHP被廣泛應用在網頁開發設計的原因之一。
細節&重點
打開和關閉沒啥好說的,這里最關鍵的點在于讀取這段,且看:
while(false !== ( $file = readdir($dir)))
{
//strip out the two entries of . and ..
if($file != "." && $file != "..")
{
echo '<li><a href="upload/'.$file.'">'.$file.'</a></li>';
}
}
讀取目錄文件,這快采用的是循環讀取,直到沒有文件為止(所有都讀完了,返回值為false)。
循環體內部有一個判斷語句:
if($file != "." && $file != "..")
這個啥意思啊 "." ".."
,這一個點啊代表當前目錄,兩個點代表上一級目錄。通過這個判斷語句的限制,就可以限制用戶進行跨目錄的訪問,從而保證服務器的安全穩定。
當然,小白也測試過去掉這個限制,服務器顯示的是無訪問權限,就像這樣:
但是,小白這邊得提醒大家,雖然沒有訪問權限,卻暴露了你的服務器文件夾結構,這樣對于黑客而言是可以鉆漏洞的。
所以啊,還是規規矩矩,嚴格按照最安全的方式去設定,麻煩一點沒關系,系統穩定安全最重要。
其實說什么黑客,都是在玩服務器端的一些邏輯漏洞而已,雖然未知的漏洞我們無法去預計,但是已知的可能性風險還是要嚴格預防的,這也是一個好的網站所必需的。
而判斷語句里面的這個就是列舉代碼:
echo '<li><a href="upload/'.$file.'">'.$file.'</a></li>';
這里,我們可以創建對列舉項目的限制,這里只是給出了文件名,并鏈接到了文件(也就是點進去可以打開文件)。
至于更多的操作,比如:刪除、修改等操作,均有具體的PHP函數對應,大家只需要添加適當的按鈕,對應相應的事件就可以了。
舉個例子:刪除某個文件
unlink($file);
為這個事件添加一個觸發按鈕(使用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";
}
?>
得出來的效果是這樣的
你可以點進去,下載、預覽已經上傳到服務器的文件。
至于更多的權限功能,還得你自己去探索啦!
各位如果有什么問題,歡迎在評論中互動留言~
End!