代码之家  ›  专栏  ›  技术社区  ›  Anton Kuzmin

在IE中启用PDF缓存

  •  2
  • Anton Kuzmin  · 技术社区  · 15 年前

    起初,缓存并不适用于所有浏览器。然后,我通过向URL添加.pdf扩展名,使它在除IE(IE8)之外的所有浏览器中都能工作。之后就不再调用servlet了。

    我通过加载以下URL的嵌入标记在网页上显示PDF文件:

    http://localhost:7001/app/viewFile.pdf
    

    JavaServlet由以下标题生成:

    response.addHeader("Content-Disposition", "inline;");
    response.setHeader("Cache-control", "cache,max-age=600");
    response.setContentType(mimeType);
    response.setContentLength(contentLength);
    

    对于在所有浏览器中显示的PDF,我使用AdobeReader9.2.0。

    如何使它在IE中也能工作?我注意到IE在 请求 例如,Safari没有。

    3 回复  |  直到 15 年前
        1
  •  1
  •   BalusC    15 年前

    如前所述, cache-control 标头值 cache 无效。使用 public 相反。

    至于IE不遵守服务器端缓存控制规则 embed object 元素,很遗憾这是IE的一个“特性”。最好的方法是用 iframe 元素。

    其他邮件头,如 expires , last-modified , etag 等等都没用。

        2
  •  1
  •   Dolph    15 年前

    需要研究的一些想法:

    1. 我不认为 cache 是有效的 Cache-Control 指令。

      尝试使用值 public 相反,或 private 如果这更适合你的内容。退房 RFC 2616 更多信息。

    2. 也许你发送了不止一个 缓存控制 指令?

      使用工具 喜欢 Firebug LiveHTTPHeaders 偷看 浏览器的实际标题是 接收。确保他们没有 得到你不期望的东西。 听起来你可能已经 尽管如此。同时确保您不会同时发送 Pragma: no-cache .

    3. 尝试设置 Expires 除了使用 缓存控制 .

      也有可能 您正在发送浏览器 冲突的 缓存控制 / Pragma headers和ie选择 语用 不管是什么原因,头都是第一优先考虑的。

    4. 确保将IE配置为允许缓存!:)

      Control Panel gt; Internet Options gt; Temporary Internet Files gt; Settings gt; Check for newer versions of stored pages

    5. 尝试发送PDF作为对 POST 请求(通过表格提交)。

      IE允许缓存发生,而不管响应中的头是什么,这是由于来自 RFC 2616 :“默认情况下,如果请求方法的要求、请求头字段, 响应状态指示它是可缓存的。“响应到 请求不可缓存,因此IE不应在其请求中包含该头。

    6. 尝试发送 Content-MD5 Last-Modified 具有一致值的头(如果尚未发送)。

      这可能有助于说服IE PDF的内容没有改变。我不认为这个解决办法行得通,因为(很明显)很顽固,但值得一提。

        3
  •  0
  •   Community CDub    8 年前

    解决这个问题的一个显而易见的方法是使用URL重写。如果IE在扩展名中使用.pdf,请使用mod_rewrite(apache)或类似的工具将服务器端重定向到正确的页面,同时让客户机认为它确实在请求一个pdf文件。

    另外:使用fiddler之类的工具查看客户端正在接收的HTTP头。

    另外:回顾这个老问题( PHP: Force file download and IE, yet again )我也遇到过类似的问题。