2008-09-03 44 views
40

您需要在PHP中添加哪些代碼才能自動讓瀏覽器在訪問鏈接時將文件下載到本地計算機?如何在PHP中自動啓動下載?

我特意想到的功能與下載網站的功能類似,只要點擊軟件名稱,提示用戶將文件保存到磁盤上?

回答

48

輸出文件之前發送以下標題:

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\""); 
header("Content-Type: application/force-download"); 
header("Content-Length: " . filesize($File)); 
header("Connection: close"); 

@grom:有趣的關於 '應用/八位字節流' MIME類型。我沒有意識到這一點,總是隻使用'應用程序/強制下載':)

36

以下是發回pdf的示例。

header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); 
header('Content-Transfer-Encoding: binary'); 
readfile($filename); 

@Swish我沒有找到應用程序/力下載的內容類型做什麼不同(在IE和Firefox測試)。是否有不返回實際MIME類型的原因?

在發佈PHP手冊 Hayley Watson

另外:

如果要強制,而不是渲染到可以下載並保存文件時,請記住,有沒有這樣的MIME類型爲「應用程序/力 - 下載」。在這種情況下使用的正確類型是「application/octet-stream」,而使用其他任何東西都僅僅依賴於客戶端應該忽略無法識別的MIME類型並使用「application/octet-stream」來替代(參考:Sections RFC 2046的4.1.4和4.5.1)。

也根據IANA沒有註冊的應用程序/強制下載類型。

+1

它可以在PC上運行,但是......當我訪問Android設備上的下載頁面時,「無法下載。不支持的內容」。爲什麼? – Emerald214 2012-07-12 09:42:17

+1

@ Emerald214沒有PDF閱讀器。或者沒有關於PDF內容類型的關聯 – grom 2012-07-13 06:38:40

+0

特別是如果目標文件類型是.zip,並且您在頁面上執行的所有操作都是通過PHP啓動文件下載,則可能需要添加```ob_clean();` ``和```ob_flush();```在上面的答案中提供的代碼之前;當試圖在Windows中本地打開.zip時,我遇到了一個問題,即以這種方式獲取的操作系統報告的.zip-archives無效,即使7zip和其他專用的壓縮歸檔格式處理工具也可以應對它們。 – SeldomNeedy 2015-07-09 22:41:00

7

一個乾淨的例子。

<?php 
    header('Content-Type: application/download'); 
    header('Content-Disposition: attachment; filename="example.txt"'); 
    header("Content-Length: " . filesize("example.txt")); 

    $fp = fopen("example.txt", "r"); 
    fpassthru($fp); 
    fclose($fp); 
?> 
0

我的代碼適用於TXT,DOC,DOCX,PDF,PPT,PPTX,JPG,PNG,壓縮擴展和我認爲它能夠更好地明確地使用實際的MIME類型。

$file_name = "a.txt"; 

// extracting the extension: 
$ext = substr($file_name, strpos($file_name,'.')+1); 

header('Content-disposition: attachment; filename='.$file_name); 

if(strtolower($ext) == "txt") 
{ 
    header('Content-type: text/plain'); // works for txt only 
} 
else 
{ 
    header('Content-type: application/'.$ext); // works for all extensions except txt 
} 
readfile($decrypted_file_path);