【问题标题】:Asp.Net Sending PDF to browserAsp.Net 将 PDF 发送到浏览器
【发布时间】:2010-10-18 16:15:48
【问题描述】:

我一直试图让这个 aspx 页面提供一个 pdf。它在 Firefox 中可以正常工作,但 IE 给出了

Internet Explorer 无法从 SERVER_NAME 下载 getform.aspx
Internet Explorer 无法打开此 Internet 站点。请求的站点不可用或找不到。

这是我的代码的一般功能。它分布在多个函数中(这就是我们不使用 WriteFile 的原因 - 有时我们会即时生成 pdf),但通常是这样的:

FileStream fs = File.Open(Path.Combine(PdfBasePath, "form.pdf"), FileMode.Open, FileAccess.Read);
Stream output = Response.OutputStream;

byte[] buffer = new byte[BUFFER_SIZE];
int read_count = fs.Read(buffer, 0, BUFFER_SIZE);
while (read_count > 0)
{
    output.Write(buffer, 0, read_count);
    read_count = fs.Read(buffer, 0, BUFFER_SIZE);
}

fs.Close();

Response.Clear();
Response.ContentType = System.Net.Mime.MediaTypeNames.Application.Pdf;
Response.AddHeader("Content-Disposition", "attachment; filename=form.pdf");
Response.Output.Flush();
Response.End();

查看 Fiddler,正在使用以下方法获取页面:

GET /getform.aspx?Failure=Y&r=someencryptedstring HTTP/1.1

它因此被返回到浏览器:

HTTP/1.1 200 正常
日期:格林威治标准时间 2009 年 4 月 9 日星期四 22:08:33
服务器:Microsoft-IIS/6.0
X-Powered-By:ASP.NET
X-AspNet-版本:2.0.50727
编译指示:无缓存
内容处置:附件;文件名=form.pdf
缓存控制:无缓存,无存储
编译指示:无缓存
过期:-1
内容类型:application/pdf
内容长度:628548

这真的让我很烦。我没有使用 SSL,否则 this KB article 似乎适用。有人有什么想法吗?

【问题讨论】:

  • 您是否尝试过从多个客户端以及不同版本的 IE 进行连接?
  • 是的。我们有两台服务器可供测试:我的本地服务器和生产规模服务器。我已经用 IE6、IE7、Firefox 和 Safari 进行了测试。除了 IE 之外,所有的工作都只是花花公子。那些只是吓坏了。其他机器也是如此。
  • 让我补充一点,无论 pdf 是否显示在浏览器窗口中,或者浏览器是否选择仅将其下载到用户 HD 上都没有关系。哪一个都好。但 IE 两者都没有。
  • 对于使用 SSL 可能遇到同样问题的其他人,请参阅此处:stackoverflow.com/questions/1038707/…

标签: asp.net internet-explorer download pdf-generation


【解决方案1】:

在标头中返回的 Content-Length 对于您要发送的文件实际上是否正确?我只是将它与我​​们在这里使用的一些生产代码进行比较,看起来我们明确设置了 Content-Length 标头。如果我没记错的话,如果标题和实际文件大小不匹配,某些浏览器会出现问题。

编辑 问题作者发现将 Content-Disposition 标头更改为 application/download 而不是 application/pdf 似乎可以解决该问题。

【讨论】:

  • 是的,他们匹配。 Windows 资源管理器报告磁盘上的文件大小为 613 KB(628,548 字节)或 616 KB(630,784 字节)。
  • 我认为基于文件和生成的 pdf 都失败了,对吧?是否可以有条件地将 Response.TransmitFile() 用于基于文件的文件,看看是否可以解决任何问题?
  • 我认为是 URL。我将代码移动到 URL 上没有加密字符串的页面,它工作正常。看起来 IE 忽略了 content-disposition 标头并使用页面的名称(包括查询字符串)作为文件的名称。
  • 您的 cmets 让我朝着正确的方向前进 - IE 忽略了 content-disposition 标签。谷歌搜索让我找到了解决方案 - 将内容类型标题更改为“应用程序/下载”似乎可以解决问题。我将您的答案标记为正确。感谢您的支持。
  • 是的,我发现您的代码和我的代码之间唯一不同的是,在 Content-Disposition 标头中,“附件”之间没有空格;和“文件名=blah”。 IE 可能只是在抱怨这个空间。我们确实使用 application/pdf 作为我们的 pdf 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2021-10-12
  • 2017-03-22
  • 2020-10-29
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多