从aspx页面下载PDF

时间:2010-11-12 09:31:15

标签: c# asp.net pdf

我有一个页面,当用户点击按钮时,会动态生成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无法打开此Internet站点。请求的网站要么不可用,要么找不到。请稍后再试“。

Publish.aspx是按钮所在的页面,因此页面 可用。 IE应该下载pdf。

上述代码是否有任何错误可能导致某些机器出现此问题?或者是特定的安全/操作系统/浏览器设置?

编辑:

这些是来自fiddler的响应头:

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

7 个答案:

答案 0 :(得分:3)

这可能是因为正确的mime类型是application/octet-stream,而不是application/octetstream

答案 1 :(得分: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();

,您的内容类型必须为=“application / pdf”

答案 2 :(得分: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

答案 3 :(得分:1)

Nicolas说“octetstream”(没有破折号)不是已知的MIME Type是正确的。

我建议使用application/pdf

答案 4 :(得分:0)

如果您使用response.TransmitFile / response.WriteFile

会有所不同吗?

TransmitFile (MSDN)
WriteFile(MSDN)

答案 5 :(得分:0)

好的,我已将内容类型更正为application / octet-stream并更改了缓存。它似乎是一个IE + SSL问题,因此我会在今晚晚些时候部署它时发现它是否有效。谢谢您的帮助。

答案 6 :(得分:-2)

在类似问题的google解决方案中找到:

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