代码之家  ›  专栏  ›  技术社区  ›  Russell

如何在IE6中显示PDF附件

  •  1
  • Russell  · 技术社区  · 14 年前

    我有一个ASP.NET应用程序,它将一个二进制PDF文件(存储在数据库中,之前已上载)返回到客户机。

    除了Internet Explorer 6(我的生活故事!).IE6中,当用户单击“打开”时,Adobe报告错误:“打开此文档时出错。找不到文件。“

    当用户单击“保存”时,PDF保存得很好,可以通过双击打开。我被难住了。谷歌已经给出了缓存(将cachecontrol设置为private等)的建议,我已经尝试了所有这些方法,但没有任何效果。

    wierd(er)行为是当我从零开始在我的ASP.NET服务器层(使用nfop)中生成一个pdf时,IE将很好地打开它(使用相同的代码!).

    这是我通过线路发送二进制数据的代码:

        // Firefox doesn't like spaces in filenames.
        filename = filename.Replace(" ", "_");
    
        string extension = Path.GetExtension(filename);
    
        string contentType;
    
        switch (extension)
        {
            case "pdf":
                contentType = "application/pdf";
                break;
            default:
                contentType = "application/x-unknown";
                break;
        }
    
        context.Response.Clear();
        context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
        context.Response.Charset = "";
        context.Response.ContentType = contentType;
        context.Response.BinaryWrite(data);
        context.Response.Flush();
    

    以下是应用程序版本:

    • ASP.NET 3.5
    • IE6.0.2900.2180.xpsp_s(美国)
    • 列表项
    • P2号公路091208-2028
    • Adobe Reader 8.0.0版
    • Windows XP SP 2
    • SQL Server 2008

    如有任何帮助/建议,我们将不胜感激。谢谢)

    编辑:

    我已经插入了fiddler来查看报头,并且确信它确实是一个缓存问题。GRRR!

    当上传我的nfop pdf(有效的)时,它会发送cache control=private。 当我的附件PDF(不工作的)被上传时,它不发送缓存。

    我在response对象中查找过,调用context.response.flush()时,这两个对象似乎都有相同的头。

    还是难住了!

    解决了的 :

    在我们的框架中,有一个流氓方法正在使用反射调用:

    // ///设置请求的expiratoin,强制不缓存 // 受保护的void setcacheexpiration(httpContext上下文) { //将缓存设置为立即过期 context.response.cache.setcacheability(httpcacheability.nocache); context.response.cache.setslidingexpiration(true); context.response.cache.setExpires(datetime.now); context.response.cache.setmaxage(新时间跨度(0,0,0)); context.response.cache.setnostore(); context.response.cache.setallowResponseInBrowserHistory(false); context.response.cache.setvalidUntilExpires(false); context.response.cache.setrevalidation(httpcacherevalidation.allcaches);

    }
    

    谢谢你的帮助,缓存!有趣的是,唯一没有缓存下载(打开时)的浏览器是IE6。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Community dbr    7 年前

    在这里 the method I've used before to render in-browser PDFs 对于IE6。再一次。。。这是一个我们在浏览器中显示PDF的项目,但对于读者中显示的PDF,它应该能很好地为您服务。

        2
  •  0
  •   Tom H    14 年前

    在我们的框架中,有一个流氓方法正在使用反射调用:

        /// <summary>
        /// Sets the expiratoin of the request and force no cache
        /// </summary>
        protected void SetCacheExpiration(HttpContext context)
        {
            //sets the cache to expire immediately
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            context.Response.Cache.SetSlidingExpiration(true);
            context.Response.Cache.SetExpires(DateTime.Now);
            context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0));
            context.Response.Cache.SetNoStore();
            context.Response.Cache.SetAllowResponseInBrowserHistory(false);
            context.Response.Cache.SetValidUntilExpires(false);
            context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
    
        }
    

    谢谢你的帮助,缓存!有趣的是,唯一没有缓存下载(打开时)的浏览器是IE6。