在IE中的子页面中,Response.TransmitFile(filePath)失败

时间:2010-12-15 18:32:18

标签: c#


我尝试将一个小的pdf文件加载到客户端浏览器。我重定向到download_page.aspx执行以下操作:

Response.ClearHeaders();  
Response.ContentType = "application/pdf";  
Response.Clear();  
Response.AppendHeader("Content-Disposition", "attachment");  
Response.TransmitFile(file);  
Response.Flush();

问题:
当我从链接或button.OnClientClick="javascript:window.open('download_page.aspx?index=20')"重定向到download_page.aspx时 有用。 PDF在客户端浏览器中打开 但是,当我点击在页面上执行某些操作然后使用ClientScript.RegisterStartupScript to redirect to download_page.aspx的按钮时,则download_page.aspx只会闪烁(闪烁)并关闭,不会加载pdf。
这是IE7,IE8的问题。它适用于Firefox 任何帮助表示赞赏 谢谢,
拉曼。

2 个答案:

答案 0 :(得分:1)

首先,您不需要ClearHeaders Clear和Flush,因此您的代码应如下所示:

Response.ContentType = "application/pdf";  
Response.AppendHeader("Content-Disposition", "attachment");  
Response.TransmitFile(file);  

现在,您还应该改进 Content-Disposition 标头值并添加文件名以简化最终用户浏览器体验。 IE与文件名的编码方式有所不同,以防它有特殊字符,所以这里有一个示例代码,您可以使用或更改为您的意愿:

public static void AddContentDispositionHeader(HttpResponse response, string disposition, string fileName)
{
    if (response == null)
        throw new ArgumentNullException("response");

    StringBuilder sb = new StringBuilder(disposition + "; filename=\"");
    string text;
    if ((HttpContext.Current != null) && (string.Compare(HttpContext.Current.Request.Browser.Browser, "IE", StringComparison.OrdinalIgnoreCase) == 0))
    {
        text = HttpUtility.UrlPathEncode(fileName);
    }
    else
    {
        text = fileName;
    }
    sb.Append(text);
    sb.Append("\"");
    response.AddHeader("Content-Disposition", sb.ToString());
}

现在,您的代码可以写成:

Response.ContentType = "application/pdf";  
AddContentDispositionHeader(Response, "attachment", filename);  
Response.TransmitFile(file);  

最后一件事是:确保没有人在传输过程中删除文件或写入文件。

答案 1 :(得分:1)

我遇到了与你相同的情况。

我终于解决了它。

请勿使用window.open。你可以简单地使用

 window.location = 'download_page.aspx?index=20'

请注意,原始页面会保持良好状态。

来自herehere

的参考