2011-12-21 194 views
18

我想讓瀏覽器從服務器上下載PDF文檔,而不是在瀏覽器中打開文件。我正在使用C#。強制瀏覽器下載PDF文檔而不是打開它

下面是我使用的示例代碼。它不工作..

string filename = "Sample server url"; 
response.redirect(filename); 
+0

爲什麼不呢?怎麼了?什麼是實際的網址? – SLaks 2011-12-21 13:27:31

+0

@SLaks ..謝謝你的回覆。它正在瀏覽器的另一個標籤中打開。不下載。 – Arun 2011-12-21 13:29:34

回答

29

你應該看看「Content-Disposition」標題;例如,將「Content-Disposition」設置爲「attachment; filename = foo.pdf」將提示用戶(通常)使用「Save as:foo.pdf」對話框,而不是將其打開。但是,這需要來自請求執行下載,所以在重定向期間您不能這樣做。但是,ASP.NET爲此提供了Response.TransmitFile。例如(假設你不使用MVC,它有其他可取的方案):如果你要渲染的文件(S),這樣你可以在你的結束,而不是在瀏覽器中打開保存

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf"); 
Response.TransmitFile(filePath); 
Response.End(); 
+0

感謝您的回覆...如果我給你一個網址而不是foo.pdf你的答案它會工作...? – Arun 2011-12-21 13:32:25

+0

@ Neon no;如果這樣做,你實際上需要傳輸內容; 'TransmitFile'採用* local *文件路徑,IIRC。 – 2011-12-21 13:33:34

+0

@ Neon澄清 - 如果URL在別的地方,你可以作爲*代理*到那個URL;但是你不能說「去那裏獲取文件,並把它當作下載」 - 提供最終內容的服務器可以選擇內容類型和處置。 – 2011-12-21 13:35:46

4

,你可以試試下面的代碼片段:

但是,如果你想使用一個客戶端應用程序,那麼你就必須使用WebClient class下載的文件。

+0

感謝您的回覆...我會嘗試您的代碼並告訴我的反饋.. – Arun 2011-12-21 13:44:06

+0

我在執行Response.BinaryWrite(outStream.ToArray())時收到「參數超出範圍異常」。 – Arun 2011-12-21 13:49:43

+0

您是否填寫了outStream中的內容?將你的文件讀入內存流,我希望它能正常工作。 – 2011-12-21 13:51:55

0

他們在大多數情況下幾乎相同,但有一個區別:

添加標題將取代使用相同的密鑰

追加頭中的一個條目不會取代鑰匙,而將再增加一。

2

我通過將inline參數設置爲true來使用它,它將在瀏覽器中顯示false,它將在瀏覽器中顯示另存爲對話框。

public void ExportReport(XtraReport report, string fileName, string fileType, bool inline) 
{ 
    MemoryStream stream = new MemoryStream(); 

    Response.Clear(); 

    if (fileType == "xls") 
     report.ExportToXls(stream); 
    if (fileType == "pdf") 
     report.ExportToPdf(stream); 
    if (fileType == "rtf") 
     report.ExportToRtf(stream); 
    if (fileType == "csv") 
     report.ExportToCsv(stream); 

    Response.ContentType = "application/" + fileType; 
    Response.AddHeader("Accept-Header", stream.Length.ToString()); 
    Response.AddHeader("Content-Disposition", String.Format("{0}; filename={1}.{2}", (inline ? "Inline" : "Attachment"), fileName, fileType)); 
    Response.AddHeader("Content-Length", stream.Length.ToString()); 
    //Response.ContentEncoding = System.Text.Encoding.Default; 
    Response.BinaryWrite(stream.ToArray()); 

    Response.End(); 
} 
相關問題