从aspx页面下载PDF文件

4

我有一个页面,当用户点击按钮时,会动态生成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文件。
是否有任何错误的代码可能导致在某些机器上出现这种情况?还是由于特定的安全/操作系统/浏览器设置?
编辑:
以下是来自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

希望能够看到所有的响应头。 - x2.
已编辑以包括响应头 - DavidGouge
7个回答

3
也许是因为正确的MIME类型是application/octet-stream,而不是application/octetstream

虽然这可能是一个问题,但这并不是导致他特定错误的原因。请参考Joop的答案。 - John

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"


application/pdf将允许浏览器显示PDF,如果配置了插件。无论插件配置如何,application/octet-stream都应该要求下载文件。(个人而言,我不喜欢PDF在没有请求保存的情况下在浏览器中打开。) - Matt

2
最近我遇到了同样的错误。在我的情况下,我使用的是https而没有缓存。这似乎是IE的一项安全功能,以防止下载该文件。根据EricLaw的IEInternals:
如果用户尝试通过HTTPS连接下载文件,任何防止缓存的响应标头都会导致文件下载失败。 链接

我也遇到了同样的问题。以下是来自链接网站的解决方法:“2010年10月更新:我对这个问题进行了进一步的调查,发现(令人惊讶的是)您可以指定Cache-Control: no-store、no-cache,下载将会成功,但如果您以相反的顺序指定这些指令,它将会失败。” 我尝试了这个方法,它起作用了。请颠倒缓存控制头。 - John

1

Nicolas是对的,没有短横线的"octetstream"不是已知的MIME类型

我建议使用application/pdf


通过使用 application/pdf,大多数浏览器将直接打开 PDF 文件,而不会询问用户是否要保存它。 - Nicolas Repiquet

0

0

好的,我已经更正了内容类型为application/octet-stream,并改变了缓存方式。这似乎是一个IE + SSL问题,所以今晚当它被部署后,我会找出是否能够解决。非常感谢您的帮助。


-2

谷歌中找到了类似问题的解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接