PHP伺服器檔案管理工具開發小結(九):jQuery動態表單實現檔案下載

來源:互聯網
上載者:User

標籤:php   lamp   檔案管理工具   jquery   檔案下載   

前文討論的檔案操作,無論是建立、編輯、移動、刪除,都是服務端對本地檔案系統的操作。這一節需要討論一個涉及服務端和用戶端協調進行的操作:檔案下載。

簡單的檔案下載可以通過將相對路徑寫入超連結的方式進行,然而這樣僅限於服務端Apache有下載許可權的文檔,如果需要支援對更多檔案進行下載,僅僅使用這一方式就遠遠不夠了。這裡需要利用PHP的能力,在服務端“取出”檔案並“推送”給用戶端。

首先是產生下載表徵圖連結:

if (is_readable($filePath)) $info.= "<li><a href=\"#\" title=\"download\" onClick=\"onDownload(‘$filePath‘)\"><img src=\"images/download32.png\" alt=\"\" class=\"tabmenu\"/></a></li>";

這裡之所以使用onDownload而不是前文的onElemAct,是為了強調此處不需要jQueryUI的前端提示。當遠程檔案被推送到本地後,會直接在瀏覽器中形成下載提示。

由於要利用瀏覽器預設的檔案下載行為,因此需要使用表單而不是jQuery的Ajax系統,因為不用處理返回資料。然而,這個表單應該是對客戶隱形的,因此考慮用jQuery動態產生表單:

function onDownload(strFilePath){var formDownload=$("<form>");formDownload.attr("id", "frmDownload");formDownload.attr("style","display:none");formDownload.attr("target","_self");formDownload.attr("method","post");formDownload.attr("action","query.php");var inputDownloadAct=$("<input>");inputDownloadAct.attr("type","hidden");inputDownloadAct.attr("name","act");inputDownloadAct.attr("value", "download");var inputDownloadFile=$("<input>");inputDownloadFile.attr("type","hidden");inputDownloadFile.attr("name","file");inputDownloadFile.attr("value", strFilePath);$("body").append(formDownload);formDownload.append(inputDownloadAct);formDownload.append(inputDownloadFile);formDownload.submit(); formDownload.remove();}

這裡將表單的target指向_self,這樣就不會彈出額外的視窗。利用append將表單填充到頁面body的尾部,用submit提交表單後,再用remove刪除表單。注意這裡使用的post請求,對應的act是download,name是檔案路徑。

PHP接收該請求後,需要組建檔案下載報文,將檔案的內容填充到報文中。

            case "download":                $isDirContentView = false;                if (isset($_POST["file"]))                {                    $filePath = urldecode($_POST["file"]);                    header("Content-Type: application/octet-stream");                    header("content-disposition: attachment;filename=".basename($filePath));                    header("content-length:".filesize($filePath));                    readfile($filePath);                }                break;

這裡,使用header函數添加額外的前序,使得報文符合合適的下載報文格式。其中重要的是為Content-Type指定合適的值,才能使瀏覽器正確分析該報文。具體值的選擇可以參考對照表。

將檔案長度寫到content-length中,然後使用readfile將檔案內容讀取到響應報文中。同時,將$isDirConentView置為false以避免多餘的檔案輸出。

下面是具體效果:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/CE/wKiom1TlUPzw82qkAAJ5ZxVPKkk256.jpg" title="PHP檔案管理工具16.png" alt="wKiom1TlUPzw82qkAAJ5ZxVPKkk256.jpg" />值得注意的是,如果使用迅雷之類下載工具捕獲這一下載請求的話,其會將POST請求該為GET請求,並使得請求內容不可控。因此本節提供的方法僅適用於使用瀏覽器直接下載的情況。

本文出自 “Accplayer的小地方” 部落格,請務必保留此出處http://accplaystation.blog.51cto.com/9917407/1614857

PHP伺服器檔案管理工具開發小結(九):jQuery動態表單實現檔案下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.