无法在64位Vista上的IE 8中显示来自HTTPS的PDF文件

43

我有一个自己开发的HTTPS服务器,用来提供简单的文件(它被嵌入在我的应用程序中)。它运行得很好 - 我一直在使用。

最近添加了SSL支持 - Chrome、FireFox和IE都很喜欢它,并且可以正常加载页面。

问题在于当我尝试通过HTTPS连接加载PDF文件时遇到了问题,在64位Vista上的IE 8(64位)中无法显示PDF。在Chrome中它可以正常工作。而当使用普通的HTTP时,它可以在IE 8中正常工作,只有在使用HTTPS时才失败。

注意:当提到IE 8时,是32位的IE 8在64位的Vista上,尽管64位的IE 8具有相同的行为。

这让我觉得这可能是IE 8 / HTTPS / PDF / 64位操作系统的问题,但我不确定。

IE 8的DebugBar显示请求和响应完全按预期进行 - 没有任何错误。 IE 8没有显示任何错误或任何内容 - 纯白屏幕(或在尝试加载PDF之前显示的页面)。已清除缓存/ cookie /等。

IE / PDF / HTTPS是否存在任何已知问题?


3
可能是因为IE浏览器的Bug(5、5.5、6、7和8版本)导致的问题,详情请参考此链接:http://support.microsoft.com/kb/323308。 - x0n
1
Acrobat/Reader仅作为32位应用程序提供。我相信Adobe也只制作了32位浏览器插件,因此没有办法在64位浏览器中查看PDF文件...至少不能使用Acrobat/Reader。 - Mark Storer
8个回答

39

我想回来给出最终答案。

感谢所有建议“不要将加密页面保存到磁盘”的人。

我遵循了EricLaw的建议并设置了:

Cache-Control: private 

我还发现我有Pragma: no-cache,我已经将其删除。

现在像魅力一样运行 :)


2
这里的罪魁祸首是“Header set Pragma“no-cache”” - 移除它后,IE8又可以显示PDF了。感谢Internet Explorer团队让我浪费了另外2个小时。 - Alexander Reifinger
只有在先添加 Response.ClearHeaders(); 的情况下,它才能与我一起正常工作(Windows 2003/IIS 6.0)。 - doekman

10

我遇到了同样的问题,只有向用户要求在Internet选项对话框的高级选项卡中关闭“不保存加密页面到磁盘”才能使其正常工作: http://support.microsoft.com/kb/812935

...然后随着紧急情况的结束,我开始查看代码(ASP.NET使用VB)。 我使用Fiddler发现即使我没有指定缓存控制标头,框架似乎也自动为我指定了no-store。 解决问题的关键实际上在于这个PHP问题中。 通过将缓存控制标头设置为max-age=1,文件将被缓存1秒钟,足够Adobe Reader从磁盘中获取并将其加载到内存中。 我们更新了代码以按以下方式生成PDF:

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=whatever.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()                                

更新:我以为它正在工作,但我想我说得太早了。我创建了一个新问题来跟进此问题。


我之前遇到过这个问题;它肯定与缓存有关;IE不会将下载缓存到系统临时文件中,因此Adobe无法从那里打开它。 - Eamon Nerbonne
谢谢Eamon,我一直在尝试,最终找到了一个编程解决方案! - wweicker
不知道这个问题是否已经解决,但根据这里的信息,我将PDF直接加载到了MSIE窗口中。之后,通过更改MSIE Internet选项/安全设置、Internet区域-自定义级别选项中的“文件下载自动提示”为启用,成功地使其正常加载。 - Remi Despres-Smyth
这对我非常有效...非常感谢,我一直在尝试网上其他人建议的各种不同方法,但直到现在都没有成功,所以谢谢 :) - Ben

10
response.setHeader("Cache-Control","private");

这对我们在IE8和IE9中起了作用。

这不需要更改浏览器的设置。


4
我在使用IE8和https时遇到了类似的问题。当我尝试将pdf流式传输到新窗口时,我得到的是一个空白的html页面(在FireFox中可以正常工作,如果不是通过https)。经过大量搜索并尝试不同的响应头变体后,对我来说解决方案是设置:Response.AppendHeader("Accept-Ranges", "none");
这会在打开pdf之前下载整个pdf,如果pdf非常大,则不太用户友好。但在我的情况下,大多数pdf只有几页。希望这能帮助某些人。

只是想说,我在Tomcat(J2EE)服务器上运行应用程序引入SSL后遇到了同样的问题,即IE7中未显示PDF文档。所有缓存控制解决方案都无效,但这个有效,即“httpResponse.addHeader("Accept-Ranges", "none");”。+1。 - CodeClimber

3

我在你的问题中没有看到任何与.NET相关的参考,但我将提供一个相关的解决方案。希望你可以从中获得所需内容,而假设你的问题涉及.NET的开发人员也可能会发现其中的价值。

以下是我以前使用过的方法,在通过HTTPS在浏览器中呈现PDF时,无需缓存。

    private void RenderPdfToResponse(byte[] documentBytes) {
        Response.BufferOutput = true;
        Response.ClearContent();
        Response.ClearHeaders();
        Response.AddHeader("Cache-control", "no-store");
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Length", documentBytes.Length.ToString());
        Response.BinaryWrite(documentBytes);
        Response.Flush();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }

**存在一种“伪缓存”,只是足够长,让Adobe Reader加载PDF文件。我寻找了一份描述我所说内容的参考资料,而一个随机论坛帖子是我能找到的最好的:

IE将PDF文件存储在分配的“易失性”内存中,并在%system%Temp中放置指针。这是文件存储的唯一位置。指针在Adobe Reader关闭时被删除,并释放分配的内存。

我无法保证技术上的准确性,但它确实反映了我使用以上方法观察到的情况。事实上,我认为该文件在Adobe Reader(在浏览器中)完成加载后就会消失。


1

我的解决方案(我们花了几天时间尝试调整标题才让它正常工作):

            if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer"
                && System.Web.HttpContext.Current.Request.Browser.Version == "8.0")
            {
                System.Web.HttpContext.Current.Response.Clear();
                System.Web.HttpContext.Current.Response.ClearContent();
                System.Web.HttpContext.Current.Response.ClearHeaders();
                System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

                System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public");
                System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60");
                System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary");

                System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename);
                System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToString());

                System.Web.HttpContext.Current.Response.BinaryWrite(document.Data);
            }

希望能帮到某些人。

0
作为用户,我在从Schwab.com加载PDF文件时遇到了同样的问题。建议“在Internet选项对话框的高级选项卡中关闭不保存加密页面到磁盘:http://support.microsoft.com/kb/812935”对我很有帮助。

0

你在Vista 64位上运行32位还是64位版本的IE?它们都包含在其中。由于不支持64位的插件很少,因此大多数情况下使用32位版本。

我会检查两者之间是否有差异。如果在Vista 64位上使用IE 8 32位可以工作,则可能是浏览器辅助对象(BHO)的64位版本引起的问题。

另外,请检查其他浏览器是否在32位模式下运行(通过任务管理器中进程名称后面的“*32”来判断)。

我还会检查HTTPS是否导致IE8出现无法缓存PDF文件的情况(通常不缓存HTTPS流量)。我会运行procmon来查看是否注意到PDF文件被写入文件系统。可能需要更改某些策略设置。我不确定是否有替代方式可以说您拥有一个PDF文件,不应该写入磁盘但仍然可以显示。


好的,Jeff说得对。实际上是在64位Vista上的32位IE(一些页面包含Flash,而目前还没有64位Flash播放器)。我会编辑问题... - DougN
可能存在保存文件的潜在问题。我更新了我的答案。 - Jeff Moser
嗯,在IE中我取消了“不保存加密页面到磁盘”的选项。看起来.jpg、.gif、.js和.css文件正被保存,但没有.PDF或.html。非常奇怪……(虽然在这种情况下是正确的,但似乎很难相信IE能够猜测出图像不包含私人信息)。 - DougN
你发送的PDF文件是使用什么MIME类型或"Content-type"? - Jeff Moser
7
你发送了哪些缓存控制头?尝试发送Cache-Control: private而不是任何禁止缓存的指令。 - EricLaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接