2011-06-25 48 views
1

我下載的文件從服務器到本地計算機是這樣的:如何下載文件,位置選擇選項

$file = ("TestFile.txt");  
header("Content-Type: application/octet-stream"); 
header("Accept-Ranges: bytes"); 
header("Content-Length: " . filesize($file)); 
header("Content-Disposition: attachment; filename=testfile.txt"); 
readfile($file); 

這是工作,但它始終保存下載文件夾中的文件不求回報的位置。我想打開窗口就像在OpenOffice/MS Word中保存任何文檔一樣,選擇文件系統上的任何位置並創建新文件夾選項。當我們保存在瀏覽器窗口中時,我所需的窗口也會運行。

希望你明白我的問題。是否有可能做到這一點,在所有瀏覽器/操作系統中工作。

謝謝

+4

多數民衆贊成在瀏覽器設置 – thetaiko

回答

3

specification of Content-Disposition讀取接收用戶代理應在filename parameter值忽略任何路徑組件:

接收[用戶代理]不應該尊重似乎存在於filename參數中的任何目錄路徑信息。文件名只能被視爲一個終端組件。

這樣做的原因是,它prones一個security vulnerability

由於該備忘錄提供發送方提供一個文件名, 接收[用戶代理]必須注意的方式,發送者的建議的文件名 不代表危險。使用UNIX作爲一個例子,一些危害 是:

  • 創建啓動文件(例如, 「.login」)。
  • 創建或覆蓋系統文件(例如,「/etc/passwd」)。
  • 覆蓋任何現有的文件。
  • 將可執行文件放入任何命令搜索路徑(例如,「~/bin/more」)。
  • 將文件發送到管道(例如,「| sh」)。
3

有沒有這樣的事情,你建議。如何處理HTTP響應,特別是如何處理不可顯示的內容(例如您的octet-stream)取決於客戶端(即Web瀏覽器)。大多數瀏覽器都會提供下載選項,但並不要求它具有任何特定的形式。像現在一樣傳遞建議的文件名與現在的瀏覽器會解釋的一樣多。

當然,總有一種定製的瀏覽器可以接受額外的頭信息,但目前沒有廣泛的瀏覽器。請記住,一般來說,我們不希望將有關客戶環境的任何信息公開給互聯網,因此即使提出類似下載路徑的內容也可能被視爲違反此規定。想象一下,我建議/etc/passwd作爲所需的位置。

如果你真的很喜歡嗅出各地訪問者的硬盤,使用ActiveX或Java小程序:-)