2010-07-27 45 views
3

我有一個腳本,用於獲取文件的內容,然後將其回顯到屏幕,問題在於它實際上是將二進制文件回顯到該頁面,我想要什麼,如果它的行爲像下載對話框將顯示下載。將文件的內容回顯給用戶,但將其作爲下載使用

我該如何做到這一點?

+0

的[保存是推動頭部強行下載遠程文件]可能重複(http://stackoverflow.com/questions/547005/save-remote-file-that-pushes-headers-to-force-download ) – 2010-07-27 18:51:39

+1

是否有任何重複的近親選民實際上讀過這個問題?這根本不是同一個問題*。 – 2010-07-27 18:58:45

回答

5

從PHP header()手冊:


// We'll be outputting a PDF 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 

更改內容類型和文件名。你可以通過file_get_contents讀用戶文件,但是或者應該工作。

2

您使用非官方但無處不在的Content-disposition標頭。見第一個例子here。瀏覽器支持文件名有一些怪癖。

您也可以簡單地將Content-type標題更改爲application/octet-stream,但是如果沒有更復雜的機制,則不能向用戶建議文件名。 (注意:application/binary可能是一個比application/octet-stream更好的選項,因爲「如果Content-Type與一個通用值匹配,比如application/octet-stream [...],許多瀏覽器將它視爲第二個在上述信號的基礎上估算值,並嘗試提出一些更具體的內容。這一步的基本原理是,一些配置錯誤的Web服務器可能會退回到所有返回的內容上。「來源:Google Browser Security Handbook)。

1

您必須更改HTTP響應的內容類型。

在「原始」 PHP(即不使用任何框架),它看起來像:

header("Content-Type: application/octet-stream"); 

有必要在腳本的開頭來調用它,之前的任何數據是呼應。

0

感謝@Brad的答案。我已經做了一些修改。我發現的是,如果我的內容被迴應比不需要做「讀取文件」。我所做的是。

header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="download.pdf"'); 
$pdf = $thirdPartyAPI->getPdf($ID); 
echo $pdf; 
ob_clean(); 
flush(); 
exit; 
相關問題