標籤: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動態表單實現檔案下載