【问题标题】:Using data URI for images in IE 6 and 7在 IE 6 和 7 中为图像使用数据 URI
【发布时间】:2013-02-14 02:26:09
【问题描述】:

我目前正在开发一个网络应用程序。它包含在服务器中动态生成的图像(因此在请求后需要一些时间才能出现)然后抛出。所以我想我会使用HTML5 local-storage API 来缓存图像,以便在后续请求同一图像时,可以立即提供服务。为此,我计划使用图像的 base64 编码作为源,而不是使用源 URL。

JS 现在不会从服务器请求图像,而是首先检查该图像数据当前是否在本地存储中可用(例如,具有属性 123 的图像存储在本地存储中 123 作为键,base 64 编码作为值)。如果是,那么只需使用从那里获得的值更改图像的源。否则请求服务器发送编码,收到后保存在缓存中。

问题是IE6IE7 不支持。如here 所述,有一种解决方法,但这涉及到一个服务器端CSS 文件来包含图像数据。由于图像将即时生成,这不符合我们的目的。我还能如何在IE6IE7 中实现这一点?

【问题讨论】:

    标签: html internet-explorer-7 base64 internet-explorer-6 local-storage


    【解决方案1】:

    或者,不要尝试在客户端缓存任何内容。在服务器端缓存生成的图像并像平常一样托管这些图像。您不需要本地存储并将其缓存在客户端。

    换句话说:

    1. 使用您的脚本生成图像服务器端
    2. 将其缓存在/httpdocs/cache/images/whatever-hash.jpg之类的地方
    3. 在您的文档中提供图像<img src="/cache/images/whatever-hash.jpg">

    如果生成图像需要 5 秒,并且您有 120 个并发用户请求 100 个唯一页面,并且您的服务器脚本在任何给定时间只能处理 4 个线程 5 秒 x (120 /4) / 60 = 2.5 分钟的服务器处理时间,然后队列的图像中的最后一个用户得到服务并将数据存储在本地存储中。

    如果所有用户都请求相同的确切页面,则花费相同的时间。每个用户缓存并没有真正的好处,因为每个用户都必须要求服务器生成他们自己的图像。此外,由于 localstorage 经常会失效,用户使用的次数越多,他们会觉得用户体验相当缓慢,我认为您的应用程序会保释。

    在服务器上缓存文件将有更多的好处恕我直言。当然它会占用服务器存储空间,但现在它相当便宜,您可以使用云 CDN(例如 www.maxcdn.com)来应对负载。

    如果您仍然决定需要缓存客户端,因为 IE6/IE7 不支持本地存储或数据 URI,请查看以下内容

    【讨论】:

    • 我也想过,但不可行。会有成千上万的用户。如果我们为每个用户在服务器上存储了大量的图像,它会变得很笨拙......
    • 图片到底是什么?我们谈论的每个用户有多少?
    • 图片是,比如说,在 Google Book Preview 中,你请求一个页面,比如 48,它就会被提供(如果合法,当然!)。这些图像是在服务器中动态生成的,因为只有书被存储为mobiepub 文件,并且基于客户端(如果是 iPad 或 iPhone 或 Kindle)提供服务(即为什么我们不能将每个页面保存为单独的图像)。而且用户数量会非常大...:) 每个用户的图像数量将是 50 个(基于对图像大小的平均估计,以及 5MB 的本地存储限制)..
    • 我仍然倾向于通过在服务器上存储页面的缓存图像来解决这个问题。我已经用我的原因编辑了我的答案。
    • 好的,将检查是否可以这样做。也就是你说的那种CDN能不能用。话虽这么说,客户端根本不可能做到吗?
    【解决方案2】:

    设置标题以通知浏览器资源已缓存:

    header("Last-Modified: " . date("D, d M Y H:i:s", getlastmod()));
    

    在 PHP 中 或

    Response.Cache.SetLastModified(DateTime.Now);
    

    在.net中

    这样浏览器会缓存资源。

    【讨论】:

    • 你的服务器端技术是什么,如何动态获取图片?
    • GWT..在这个应用程序中设置像页面加载这样的标题是禁止的,原因有很多......
    • 您可以仅为图像设置它们。您可以为您的网络服务器设置一个过滤器,将 Last-Modified 添加到 http 标头。您也可以指定过期时间。
    • 您可以使用服务器端或客户端缓存,对于 Apache:httpd.apache.org/docs/2.2/caching.html。看看什么最适合您,同时阅读本指南:developer.yahoo.com/performance/rules.html
    猜你喜欢
    • 2011-10-13
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多