PHP | 小白建站筆記之 目錄文件交互

在之前的文章中,小白已經(jīng)幫大家搞定了文件上傳的關鍵技術掰烟。文件上傳搞定了,下面我們要做的就是要對上傳的文件進行操作扩灯,比如查看已經(jīng)上傳的文件信息媚赖、下載、刪除等操作珠插。

圖文 / 丁建雄

小白是單純?yōu)榕d趣而寫作的獨立創(chuàng)作人惧磺,如果您喜歡小白的文章,歡迎關注捻撑、交流磨隘、分享(引用請鏈接到本文)。

等待與希望 By [Peter Brunner](https://500px.com/peter_brunner)

目錄文件交互簡介

所謂目錄文件交互顾患,指的是用戶對存放在服務器端的文件進行讀寫等權限的交互動作番捂。

為了維護服務器端的穩(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";
  }
?>

得出來的效果是這樣的

Directory listing 部分就是啦

你可以點進去,下載丑罪、預覽已經(jīng)上傳到服務器的文件荚板。

至于更多的權限功能,還得你自己去探索啦吩屹!

各位如果有什么問題跪另,歡迎在評論中互動留言~


End!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煤搜,一起剝皮案震驚了整個濱河市免绿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擦盾,老刑警劉巖嘲驾,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淌哟,死亡現(xiàn)場離奇詭異,居然都是意外死亡距淫,警方通過查閱死者的電腦和手機绞绒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榕暇,“玉大人蓬衡,你說我怎么就攤上這事⊥啵” “怎么了狰晚?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缴啡。 經(jīng)常有香客問我壁晒,道長,這世上最難降的妖魔是什么业栅? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任秒咐,我火速辦了婚禮,結果婚禮上碘裕,老公的妹妹穿的比我還像新娘携取。我一直安慰自己,他們只是感情好帮孔,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布雷滋。 她就那樣靜靜地躺著,像睡著了一般文兢。 火紅的嫁衣襯著肌膚如雪晤斩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天澳泵,我揣著相機與錄音,去河邊找鬼兼呵。 笑死,一個胖子當著我的面吹牛萍程,可吹牛的內(nèi)容都是我干的兔仰。 我是一名探鬼主播茫负,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乎赴!你這毒婦竟也來了忍法?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饿序,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后原探,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乱凿,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年咽弦,在試婚紗的時候發(fā)現(xiàn)自己被綠了徒蟆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡段审,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寺枉,到底是詐尸還是另有隱情,我是刑警寧澤绷落,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甘畅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏往弓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一函似、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撇寞,春花似錦、人聲如沸蔑担。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸟缕。三九已至,卻和暖如春懂从,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背番甩。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缘薛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓掩宜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牺汤。 傳聞我的和親對象是個殘疾皇子辽旋,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 文件的下載很簡單补胚,在前端HTML標記語言中就能實現(xiàn)。但是追迟,文件的上傳卻不是那么容易,需要進行服務器端的簡單編程敦间。而...
    丁建雄閱讀 1,188評論 1 11
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)廓块,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 1带猴、第八章 Samba服務器2、第八章 NFS服務器3拴清、第十章 Linux下DNS服務器配站點靶病,域名解析概念命令:...
    哈熝少主閱讀 3,735評論 0 10
  • 圖片源自網(wǎng)絡口予,侵刪 一 相府被抄娄周,再醒來時我已經(jīng)跪在皇宮大殿上沪停,腳上戴著沉重的鎖鏈煤辨。富麗堂皇的大殿上跪滿了相府的人...
    薄幸偶遇塵中客閱讀 731評論 3 4