【问题标题】:Force PDF Download in ASP.NEt with IE使用 IE 在 ASP.NET 中强制 PDF 下载
【发布时间】:2011-04-07 14:01:38
【问题描述】:

所以,我使用了一些代码来强制下载我的基于 ASP.Net 的项目。这段代码在 Firefox 和 Chrome 中有效,但在 IE 中却因为某些奇怪的原因而无效。更奇怪的是,它最初适用于所有三个,最近才停止在 IE 中工作。以下是我使用的代码,如果需要进行任何调整或可能存在什么问题,请告诉我。

 string path = MapPath(fname);
    string name = Path.GetFileName(path);
    string ext = Path.GetExtension(path);
    string type = "Application/pdf";
    Response.AppendHeader("content-disposition","attachment; filename=" + path);
    Response.WriteFile(path);
    Response.End();  

更多细节 这是修改后的代码,仍然不适用于 IE。

 string path = MapPath(fname);
    string name = Path.GetFileName(path);
    string ext = Path.GetExtension(path);
    string type = "Application/pdf";
    Response.ClearHeaders();
    Response.ClearContent();
    Response.ContentType = type;
    Response.AddHeader("content-disposition","attachment; filename=" + path);
    Response.WriteFile(path);
    Response.End();  

【问题讨论】:

  • 如果您使用用户提供的文件名,您应该使用System.Net.Mime.ContentDisposition 来构造标题 - 这将正确处理文件名中的空格和非 ASCII 字符。或者,如果这是 MVC,那么您可以使用 return File(...);

标签: asp.net internet-explorer firefox pdf google-chrome


【解决方案1】:

您可能应该尝试将 mime 类型设置为“application/octet-stream”。如果您不希望特定的处理程序响应 mime-type。

【讨论】:

  • 在这种情况下我也是这样做的。
  • 我都使用了它们,它们产生相同的结果
【解决方案2】:

应该是这个代码

 Response.AddHeader("content-disposition","attachment; filename=" + path);

改成

 Response.AddHeader("content-disposition","attachment; filename=" + name + "." + ext);

 Response.AddHeader("content-disposition","attachment; filename=" + name + ".pdf");

需要检查的其他事项

  1. Response.Buffer 开头为 true
  2. Response.clear 开头
  3. 使用 response.binarywrite 代替 writefile
  4. 最后刷新响应
  5. 确保没有 HTML 或空格字符写入 response.stream,而不是 binarywrite。

【讨论】:

  • 我仍然认为您应该使用 ContentDispositon 类,以便正确转义名称。但是为什么 BinaryWrite 不是 WriteFile?看起来他的内存中没有文件。
  • 为什么会慢一些?我希望它至少与加载到内存和 BinaryWriting 自己一样快。但也许他想要TransmitFile
  • 一个 pdf 文件包含二进制和文本内容。所有这些都需要二进制写入。使用 writefile,浏览器的纠错代码将尝试将文件作为文本抓取,然后找到流入的二进制文件。使用 Binarywrite,特别是对于像 IE 这样的脑死浏览器,不会造成混淆。对这两种方法都进行了一些测试,发现 binarywrite 更快。但正如你所说,传输文件是更好的选择。
【解决方案3】:

问题解决了。它没有通过的原因是由于母版页上存在一个额外的表单,显然覆盖了按钮。一旦修复,它在所有浏览器中都能正常工作。

【讨论】:

    【解决方案4】:

    在顶部添加以下两行,为我修复它:

    Response.ClearContent();
    Response.ClearHeaders();
    

    【讨论】:

    • 字符串路径 = MapPath(fname);字符串名称 = Path.GetFileName(path); string ext = Path.GetExtension(path);字符串类型=“应用程序/pdf”; Response.ClearHeaders(); Response.ClearContent(); Response.ContentType = 类型; Response.AddHeader("content-disposition","attachment; filename=" + path); Response.WriteFile(路径); Response.End();
    • @Craig - 你是说这两条线对你有用吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 2012-05-21
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多