如何在使用Acrobat Reader 10.0(HTTP1.0/HTTP1.1)进行PDF流式传输时防止缓存

7

我正在尝试找到一种方法,以防止浏览器缓存使用流式加载的PDF文件。

FireFox和Chorme可以很好地处理以下标头,并且不会缓存任何pdf文件:

Response.AddHeader("Pragma", "no-cache, no-store"); Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); Response.AddHeader("Expires", "-1");

然而,只有IE 7(带有Acrobat Reader 9.4.1)可以使用以下标头并防止缓存PDF文档:

Response.AddHeader("Pragma", "no-cache, no-store"); Response.AddHeader("Cache-Control", "private, must-revalidate, max-age=0"); Response.AddHeader("Expires", "-1");

当我尝试使用带有Acrobat Reader 10的IE 7时,上述标头无论我尝试什么都没有任何区别,并且缓存了PDF。

当我尝试使用 Cache-Control: no-cache, no-store 时,根本没有加载pdf。 据我所知,IE使用缓存机制来加载PDF文档。

是否有人熟悉全局或特定的方式(例如使用其他标头)可以帮助防止PDF文档的缓存?

4个回答

7

在URL的路径或查询字符串中添加一个随机数。这样,每次下载文件时都会使用新的URL。如果文件发生更改,您还可以仅更改数字,例如使用文件的最后修改时间(mtime)。

PHP(因为所有人都理解它,即使没有人喜欢它):

 <a href="document.pdf?buster=<?= time() ?>">Download PDF</a>

这绝对是这种问题的一个优雅的解决方案。 - Grubsnik
如果服务器上的PDF文件名中有空格,则此方法无法正常工作。 - sskoko

1

使用 no-cache 标头来显示 PDF(和其他文档类型)的问题已被报告给微软作为一个错误:http://support.microsoft.com/kb/316431。IE 在内联阅读 PDF 时使用自己的缓存机制。

不幸的是,微软的人说这是“按设计工作的”,用户不应该使用 no-cache 标头... 真是匪夷所思。

您可以尝试 VSU 的想法,使用 Java PDF 阅读器... 我也可能会选择这种方法。


0

控制管道下的缓存设置并不是绝对可靠的。另一种选择是在PDF文件名中编码实时和日期。


0

您可以将时间日期编码到PDF文件名中,以便每次请求时文件名都是唯一的。

Response.AddHeader "Content-Disposition","attachment;filename=somename" + CurrentDate() + Currenttime() ".pdf"

CurrentDate和CurrentTime是虚构的函数。您需要编写该代码。


通过发送这个头部,浏览器会要求我下载文件。当我尝试将“inline”替换为“attachment”时,它仍然被保存到缓存中。有没有建议如何在不缓存的情况下流式传输PDF文档? - Niv
1
我以为你不想把PDF文档缓存起来是为了确保每次生成新的PDF。现在,我意识到你想要防止它被存储在客户端。你可以创建一个Java小程序,下载PDF并显示它,在用户完成操作后删除它。服务器可以加密它,小程序可以进行解密以提高安全性。以下是我们的Java PDF阅读器的示例,可以在网页中显示PDF:http://www.gnostice.com/nl_article.asp?id=195&t=A_Java_PDF_Web_Viewer_-_Powered_By_PDFOne_(for_Java_trade;)。 - BZ1
你好,感谢您的回复。我正在寻找一种不包含任何第三方或外部代码的解决方案。只是想弄清楚为什么浏览器(或Acrobat插件)会忽略指定的头信息。提前感谢您的答复。 - Niv

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