2011-04-12 87 views
7

如果意味着文件駐留在第三方服務器上(無需事先下載或流式傳輸),如何將文件作爲附件發送到瀏覽器?將文件作爲附件發送到瀏覽器

+3

有沒有辦法來實現這一目標。您對處理遠程資源沒有影響。而HTTP客戶端不支持'message/external-body'有效載荷。 – mario 2011-04-12 21:08:42

回答

-1

如果你想提供定期瀏覽器(圖像,HTML,...)處理的文件,你將不得不增加一個頭的東西,如改變MIME類型:

header("Content-Type: application/force-download; name=filename");

如果您沒有訪問第三方服務器,你別無選擇,只能通過附加標題

+2

更好地使用* application/octet-stream *。 – Gumbo 2011-04-12 20:58:26

4

http://php.net/manual/en/function.header.php#example-3655

下載該文件自己把它提供給用戶

如果您希望提示用戶保存要發送的數據(如生成的PDF文件),則可以使用»Content-Disposition標題提供建議的文件名並強制瀏覽器顯示保存對話框。

<?php 
// 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'); 
?> 
+0

這將發送一個本地存儲的文件,請重新閱讀手頭的問題。 – RobertPitt 2011-04-12 21:04:57

14

從另一臺服務器,而無需下載到您的服務器:

header('Location: http://thirdparty.com/file.ext'); 

,而無需下載文件在本地您沒有授權在外部服務器,所以你必須告訴瀏覽器做什麼,因此重定向頭,它會告訴服務器直接去提供的URL,從而加載下載。

從你的服務器,你會怎麼做:

if (file_exists($file)) 
{ 
    if(false !== ($handler = fopen($file, 'r'))) 
    { 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($file)); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); //Remove 

     //Send the content in chunks 
     while(false !== ($chunk = fread($handler,4096))) 
     { 
      echo $chunk; 
     } 
    } 
    exit; 
} 
echo "<h1>Content error</h1><p>The file does not exist!</p>"; 

從另一個question兩者我有answered

+6

fopen需要2個參數,第二個應該是模式,在這種情況下,讀取 – 2013-04-09 18:51:24

+0

fopen + fread的「r」不是一個好方法 - 太慢。 在標題後面使用readfile($ file)加快速度。 – Asaelko 2016-04-27 13:01:36

0

正如其他人所說,你必須設置響應文件的內容處置頭下載請求。但是,您已經在第三方服務器上說過該文件。除非您可以控制該服務器發送文件的方式,否則無法更改瀏覽器從該服務器檢索的方式。

但是,您可以代理該文件,以便服務器下載該文件,然後使用相應的標頭將其傳遞到客戶端。這意味着你的帶寬賬單增加了一倍,因爲你不得不同時下載文件並上傳。

+0

他沒有事先下載或流式傳輸。 – RobertPitt 2011-04-12 21:04:15

+0

@RobertPitt:魔術呢? – drudge 2011-04-12 21:30:12

+0

不完全相同,使用重定向功能會創建文件從服務器下載的錯覺。 – RobertPitt 2011-04-12 21:31:51

0

只是爲那些在包含空格的名稱上遇到問題的人提供一個說明(例如「test test.pdf」)。

在示例中(99%的時間),您可以找到 header('Content-Disposition:attachment; filename ='。basename($ file));但是設置文件名的正確方法是引用它(雙引號): header('Content-Disposition:attachment; filename =''。basename($ file)。''')

一些瀏覽器可以工作,沒有報價,但肯定不是Firefox和Mozilla的解釋,在內容配置文件名的報價是根據RFC http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

相關問題