2010-11-12 153 views
4

我有一個頁面,當用戶點擊一個按鈕時,PDF就會動態生成並提供給他們下載。從aspx頁面下載PDF

此處所說的讓用戶下載PDF的代碼:

// Omitted code that generates the pdf bytes 

response.ContentType = "application/octetstream"; 
response.AppendHeader("Content-Disposition", "attachment; filename=" + filename); 
response.BinaryWrite(pdfBytes); 
response.End(); 

在我的機器和其他許多人使用Chrome的混合物,IE 7/8/9B和Firefox,這是按預期工作;用戶點擊按鈕,PDF文件被下載。

在IE7的某些情況下,我們的用戶也報告說,他們所得到的錯誤消息:

「Internet Explorer無法從thesite.com下載Publish.aspx

的Internet Explorer無法打開此互聯網站點,請求的站點不可用或無法找到,請稍後再試。「

Publish.aspx是該按鈕所在的頁面,所以頁面可用。 IE應該下載pdf。

上面的代碼有什麼問題可能導致某些機器出現這種情況?或者是否是特定的安全/操作系統/瀏覽器設置?

編輯:

這些是小提琴手響應頭:

HTTP/1.1 200 OK 
Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache 
Content-Type: application/octetstream 
Expires: -1 
Server: Microsoft-IIS/7.5 
Content-Disposition: attachment; filename=myPdf.pdf 
X-AspNet-Version: 2.0.50727 
X-Powered-By: ASP.NET 
Date: Fri, 12 Nov 2010 09:48:06 GMT 
Content-Length: 45772 
+0

這將是很高興看到所有響應標題。 – 2010-11-12 09:41:50

+0

編輯以包含響應標題 – DavidGouge 2010-11-12 09:49:52

回答

2

最近我遇到了同樣的錯誤。在我的情況下,我使用https和不緩存。它似乎是IE中的一項安全功能,不會下載該文件。來自EricLaw的IEInternals:

如果用戶嘗試通過HTTPS連接下載*文件,則任何防止緩存的響應標頭都將導致文件下載過程失敗。

http://blogs.msdn.com/b/ieinternals/archive/2009/10/02/internet-explorer-cannot-download-over-https-when-no-cache.aspx

+0

我遇到了同樣的問題。下面是鏈接網站的一個解決方法:「更新2010年10月:我對這個問題進行了一些進一步的調查,發現(令人驚訝的)你可以指定緩存控制:無存儲,無緩存和下載將工作,但如果你以相反的順序指定這些指令,它將會失敗。「我試過這個,它工作。反轉緩存控制標題。 – John 2014-02-12 22:12:11

3

這也許是因爲正確的MIME類型是application/octet-stream,不application/octetstream

+0

雖然這可能是一個問題,但這不是導致其具體錯誤的原因。看喬普的答案。 – John 2014-02-12 22:13:32

-2

在類似問題的google發現的解決方案:

Response.AppendHeader('Expires', 'Sun, 17 Dec 1989 07:30:00 GMT'); 
2

嘗試使用Response.OutputStream

filepath= Server.MapPath(filepath); 
       FileStream strm = new FileStream(filepath, FileMode.Open, FileAccess.Read); 

       byte[] fileByte = new byte[strm.Length]; 
       int x = strm.Read(fileByte, 0, fileByte.Length); 

       Response.Clear(); 
       Response.AddHeader("Accept-Header", fileByte.Length.ToString()); 
       Response.AddHeader("Content-Disposition","inline; filename=" + filename); 
       Response.ContentType = "application/pdf"; 
       Response.OutputStream.Write(fileByte, 0, fileByte.Length); 
       Response.Flush(); 
       strm.Close(); 

和內容類型必須是= 「應用程序/ PDF」

+0

如果有一個插件被配置來執行此操作,application/pdf將允許瀏覽器顯示PDF。無論插件配置如何,application/octet-stream都應該要求下載文件。 (就我個人而言,我不喜歡在瀏覽器中打開PDF而不要求保存。) – Matt 2010-11-12 10:20:50

1

Nicolas是正確的那「octetstream」(沒有短劃線)不是已知的MIME Type。我建議使用application/pdf

+0

通過使用'application/pdf',大多數瀏覽器將直接打開PDF文件,而不是要求用戶保存它。 – 2010-11-12 10:10:19

0

OK,我已經糾正了內容類型應用程序/八位字節流,改變了緩存。這似乎是一個IE + SSL問題,所以我會在今晚晚些時候部署它時發現它是否有效。謝謝您的幫助。