【问题标题】:PDF download from aspx page从 aspx 页面下载 PDF
【发布时间】:2010-11-12 09:31:15
【问题描述】:

我有一个页面,当用户单击按钮时,会动态生成 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

【问题讨论】:

  • 很高兴看到所有响应头。
  • 已编辑以包含响应标头

标签: c# asp.net pdf


【解决方案1】:

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

【讨论】:

  • 虽然这可能是一个问题,但这并不是导致他的具体错误的原因。请参阅乔普的回答。
【解决方案2】:

最近我遇到了同样的错误。就我而言,我使用的是 https 而没有缓存。不下载文件似乎是 IE 中的一项安全功能。来自 EricLaw 的 IEInternals:

如果用户尝试通过 HTTPS 连接下载*文件,任何阻止缓存的响应标头都将导致文件下载过程失败。

Link

【讨论】:

  • 我遇到了同样的问题。以下是链接站点的解决方法:“2010 年 10 月更新:我对此问题进行了进一步调查,发现(令人惊讶)您可以指定 Cache-Control: no-store, no-cache 并且下载将起作用,但如果您以相反的顺序指定这些指令,它将失败。”我试过了,它奏效了。反转缓存控制标头。
【解决方案3】:

尝试使用 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。)
【解决方案4】:

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

我建议使用application/pdf

【讨论】:

  • 大部分浏览器使用application/pdf会直接打开pdf文件,而不是询问用户是否保存。
【解决方案5】:

如果你使用response.TransmitFile/response.WriteFile会有什么不同吗?

TransmitFile (MSDN)
WriteFile(MSDN)

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-07-05
        • 2019-06-28
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多