【问题标题】:Is it possible to know if a file is inside the user's browser cache?是否可以知道文件是否在用户的浏览器缓存中?
【发布时间】:2010-10-29 06:06:42
【问题描述】:

我正在做这样的事情:如果图像缓存在用户计算机上并且其时间戳与服务器上的时间戳相同,则显示缓存版本;否则,请勿从服务器加载图像。

我想也许 JavaScript 可以做到这一点,所以我将这篇文章标记为 javascript。如有不妥,请帮我重新标记。

编辑:在这里,我将详细介绍我将要实现的内容。我正在开发类似基于 Web 的文件资源管理器的东西,只有当用户单击每个图像旁边的“查看缩略图”按钮时才会加载缩略图。如果缩略图已被缓存,则使用缓存版本;否则,显示通用图像图标。

【问题讨论】:

    标签: javascript browser-cache


    【解决方案1】:

    这对我来说有点奇怪。

    您将您的功能描述为显示文件列表并为用户提供单击“查看缩略图”的选项。这意味着它只会在用户特别请求图像时尝试从服务器加载图像 - 因此您已经停止了大量加载大量图像的可能性。

    因此,如果图像不在我的浏览器缓存中(在我第一次访问时不会出现),那么我将获得通用图像图标。在我下次访问时,图像仍然不会在我的缓存中,所以我将再次获得通用图像图标。那么除了通用图像图标之外,我将如何看到任何东西呢?

    现在介绍一个解决方案,我承认它不符合您的要求,但这是此类软件的典型实现。

    1. 使用“显示缩略图”选项显示文件
    2. 选择“显示缩略图”选项时,从服务器加载缩略图(请注意,脚本通常会提供调整大小的图像,该图像也可能存储在服务器上,以避免再次处理调整大小一定的时间)
    3. 浏览器会自动缓存图片,并在一段时间内阻止进一步的服务器请求

    【讨论】:

    • 你明白了!我只是想让它更聪明一点,如果缩略图在缓存中,“查看缩略图”按钮根本不会显示(用 javascript 删除)
    • @Ethan - 正如您所解释的,如果图像被缓存,它将显示。如果未缓存,它将显示通用图像。听起来您可以编写一些逻辑来说明 if(generic_image is visible) hide_view_thumbnail... 对吧?
    • @Flash84x - 我想写一些if (image_thumbnail is in cache) { generic_image.replaceWith(image_thumbnail); view_thumbnail_button.hide(); } 的逻辑。因此我想知道javascript是否可以确定文件是否被缓存。
    【解决方案2】:

    我的 RSS 阅读器,对于有很多帖子的提要,会加载一整页的帖子。条目的数量取决于实际窗口的大小。当我滚动到列表底部时,如果有更多帖子,它将加载另一个页面。

    这适用于您的文件浏览器吗?这意味着用户总是会加载 20 个缩略图,但除非有必要,否则永远不会再加载。我从来没有使用过需要我点击才能查看缩略图的文件浏览器。

    【讨论】:

    • 听起来是个不错的解决方案!明天我会决定走的路。
    【解决方案3】:

    浏览器可以发送“If-Modified-Since”和“ETag”标头来向服务器表明它确实有一个资源版本。请检查W3 caching rules 中有关这些标头的信息。

    您可以在服务器上查询这些标头,如果未找到则发回通用图标,如果找到则返回“304 Not Modified”响应。

    【讨论】:

      【解决方案4】:

      这不是您必须担心的事情。浏览器会自动为您执行此操作。您必须确保服务器发送正确的标头。对文件进行适当的缓存设置确实有助于避免额外的 HEAD 请求。

      【讨论】:

      • 我认为通常如果文件不在浏览器缓存中,它将从服务器加载。那不是我想要的。我想阻止下载。
      • 您也许可以使用 cookie 获得类似的结果。如果你为每张图片传递一个唯一的 cookie,那么就会有一些具体的东西需要检查。
      • 谢谢。但是对于我的项目来说,cookie 可能不是一个好方法,因为图像的数量可能很大。
      【解决方案5】:

      你不能在服务器上移动/删除/重命名它吗?然后使用 javascript Image.onError 处理损坏的图像,为没有缓存图像的人隐藏损坏的图像标签。

      我认为这将为那些在他们的浏览器中拥有它的人显示缓存版本。其他人什么都看不到

      【讨论】:

      • 感谢您的想法,但这不是我的项目的方式。刚刚编辑了帖子,并提供了有关我将要实施的内容的更多详细信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多