2

重现问题的步骤:

  • 第 1 步:假设您已清理浏览器 (firefox) 上的缓存历史记录。

  • 第 2 步:您在浏览器上键入 www.stackoverflow.com 以获取缓存文件夹中的一些新数据。

  • 第 3 步:在浏览器中输入“cache:about”

  • 第 4 步:单击“磁盘缓存设备/列出缓存条目”

  • 第 5 步:我搜索一些已下载到我的缓存文件夹的“.png”文件。并注意到数据大小实际上是 16425 字节。

  • 第 6 步:复制图像在计算机上的存储路径。

  • 第 7 步:在继续处理有问题的问题之前,我通过单击此链接快速查看图像的外观。

  • 第 8 步:检查图像

  • 第9步:开始/运行/并粘贴我们最近复制的路径,图像已存储在您的系统上。

  • 第10步:这是图像!但是我们必须手动输入“.png”

  • 第11步:我看看它的样子:

  • 第 12 步:我编辑图像我想更改文件的大小,并具有与浏览器缓存的真实大小不同的大小。所以我把图像变小并保存它。

  • 第 13 步:我检查文件的大小是否真的发生了变化。以前是 17kb 现在是 3kb。

  • 第 14 步:我删除了添加到文件名中的“.png”文本,以便浏览器可以读取它

  • 第 15 步:现在我在浏览器上按重新加载,文件不会被读取!

预期结果: - 在示例中,为了便于理解,我使用了“.png”,但您没有得到相同的结果。在我的真正问题上,amb 试图让缓存读取一个 FLASH .swf 文件,我已经主动更改了它的原始数据大小。有什么想法吗?链接?我无法在互联网上找到有关如何让浏览器再次读取已下载文件的信息,即使大小已更改!

4

2 回答 2

1

关键是客户端将永远不会再次检查服务器是否已缓存,直到(并且如果)该元素的缓存已过期。将 HTTP 标头的最大期限设置为 10 分钟,如果自上次下载以来已超过 10 分钟,客户端将重新下载它。你不能仅仅因为大小改变而更新。除非您有 JS 或 ajax 或其他东西会根据客户端检查服务器以查看最近是否有更改时检索到的某些结果来更新客户端缓存,否则这是不可能的。

因此,如果您必须拥有它,您将必须根据服务器上的现有数据跟踪服务器是否发生变化。例如,服务器跟踪初始大小。如果您更改图像大小(或假设您的 Web 应用程序中的某些内容更改了它),服务器将知道这已在服务器上更改(因为它总是会在服务器上获取当前图像大小)。因此,您还需要在下载图像时使用 cookie 或 html5 localStorage 跟踪客户端上的图像大小。

因此,脚本的客户端部分在页面加载时请求服务器(也发送存储在 cookie 或 localStorage 中的图像大小),然后服务器脚本会将当前图像的大小与客户端发送的大小进行比较。如果不同,它会显式地使客户端缓存过期,这意味着客户端必须显式地重新下载图像。否则它什么也不做,只使用缓存的图像。

所以基本上,如果你想要这种功能,你需要像对待登录 cookiet 一样对待你的图像(服务器显式跟踪它、使其过期、设置新的、过期等)。

于 2013-02-10T03:05:12.597 回答
0

我遇到了同样的问题,终于得到了解决,感谢这个线程。

这仅适用于火狐。转到 about:config 将变量“browser.cache.check_doc_frequency”(默认 3)编辑为 2(http://kb.mozillazine.org/Browser.cache.check_doc_frequency

编辑缓存目录中的文件。(不管新大小是否不同!)无需更改 chache_001 中的文件大小条目。

希望这可以帮助你。

编辑:只要确保文件大小小于 swf 文件的原始大小即可。

原因:我真的不知道,但是当我尝试为在线游戏编辑 swf 时,游戏无法再加载新的缓存文件(如 firefox 为该事物保留 x 内存字节,x 由服务器指定。 .但文件大于x字节,因此不会加载整个文件,也不会加载flash电影)。

我将 swf 中的一些图像编辑为相同大小的空白图像,重新编译并重新压缩以得到比原始 swf 更低的文件大小,并且成功了!

于 2013-07-11T00:25:58.353 回答