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

在之前的文章中,小白已經幫大家搞定了文件上傳的關鍵技術。文件上傳搞定了,下面我們要做的就是要對上傳的文件進行操作,比如查看已經上傳的文件信息、下載、刪除等操作。

圖文 / 丁建雄

小白是單純為興趣而寫作的獨立創作人,如果您喜歡小白的文章,歡迎關注、交流、分享(引用請鏈接到本文)。

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

目錄文件交互簡介

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

為了維護服務器端的穩定安全,這一動作在絕大多數情況下是只讀 權限的。

但是,由于一些特殊的用戶要求,我們可以部分地開放一些高級權限。比如,作為公司成員,我們需要每天提交匯報材料到服務器端,這樣就要求服務器給我們以 操作的權限。

在上一篇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";
  }
?>

得出來的效果是這樣的

Directory listing 部分就是啦

你可以點進去,下載、預覽已經上傳到服務器的文件。

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

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


End!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,269評論 25 708
  • 文件的下載很簡單,在前端HTML標記語言中就能實現。但是,文件的上傳卻不是那么容易,需要進行服務器端的簡單編程。而...
    丁建雄閱讀 1,204評論 1 11
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 1、第八章 Samba服務器2、第八章 NFS服務器3、第十章 Linux下DNS服務器配站點,域名解析概念命令:...
    哈熝少主閱讀 3,771評論 0 10
  • 圖片源自網絡,侵刪 一 相府被抄,再醒來時我已經跪在皇宮大殿上,腳上戴著沉重的鎖鏈。富麗堂皇的大殿上跪滿了相府的人...
    薄幸偶遇塵中客閱讀 757評論 3 4