惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
aimingoo的专栏
aimingoo的专栏
T
The Blog of Author Tim Ferriss
IT之家
IT之家
罗磊的独立博客
博客园_首页
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
量子位
Hugging Face - Blog
Hugging Face - Blog
G
Google Developers Blog
博客园 - 叶小钗
H
Help Net Security
N
Netflix TechBlog - Medium
B
Blog
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
Vercel News
Vercel News
博客园 - 三生石上(FineUI控件)

博客园 - Ricebug

android SDK下载及中文API地址 怎么让我们自己开发的Android程序设为默认启动 在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错 Eclipse 安装中文插件 Android开发环境搭建(jdk+eclip+android sdk) JS innerHTML Double Quotes 正则表达式有无g参数时,test()结果的差异 [转载]分享8个超棒的免费高质量图标搜索引擎 平时技巧收集 ActionScript3.0平铺由外部加载的图片 - Ricebug - 博客园 截取中英文字符串 IE处理GIF动画图片onload事件的一个BUG BulkLoader类使用 JS文件传参及处理技巧 [原创]jQuery动画弹出窗体支持多种展现方式 JQuery上传插件Uploadify使用详解及错误处理 [原创]jQuery插件处女座--超链接滑动动画 js页面定位,相关几个属性 全国哀悼日 网站变灰装(附代码)
Asp.net缓存动态图片
Ricebug · 2010-06-11 · via 博客园 - Ricebug

    最近在模仿QQ的相册,发现QQ相册中的大小图片都是动态的,通过抓包工具发现Http返回的状态码是304.

大家应该都知道当浏览器缓存了文件就直接从缓存中读取,状态码就是304.所以QQ相册的这种动态缓存技术让我研究了一段时间,现把研究结果记录下来,备用。

实现原理:

首先,要知道原始图片的最后一次修改时间。

其次,获取本地缓存文件夹中该文件的时间。

最后,两个时间比较,如果本地缓存的时间大于原始图片最后一次修改的时间,那么就告诉浏览器本地已经有这个文件了,不用再去请求了,将HTTP状态值置为304即可;否则就去动态生成你需要的小图片,并且将这个小图片通过设置 Last-Modified HTTP标头来实现本地访问时间。

好了,原理我们知道了,那代码怎么实现呢?

代码

protected void Page_Load(object sender, EventArgs e)
{
string imgPath = string.IsNullOrEmpty(Request["imgPath"]) ? "" : Request["imgPath"].ToString();

Response.ContentType

= "image/jpeg";
DateTime contentModified
= System.IO.File.GetLastWriteTime(imgPath); if (IsClientCached(contentModified))
{
Response.StatusCode
= 304;

Response.SuppressContent

= true;
}
else
{

Thumbnail.GenerateHighThumbnail(imgPath,

80, 80); //这里是生成缩略图的代码,网上到处都是,这里就不展现了。

Response.Cache.SetETagFromFileDependencies();
Response.Cache.SetAllowResponseInBrowserHistory(
true);

Response.Cache.SetLastModified(contentModified);
}

}

private bool IsClientCached(DateTime contentModified)
{
string header = Request.Headers["If-Modified-Since"];if (header != null)
{
DateTime isModifiedSince;
if (DateTime.TryParse(header, out isModifiedSince))
{
return isModifiedSince >= DateTime.Parse(contentModified.ToString());
}
}
return false;
}

重点说一下IsClientCached方法中的 return isModifiedSince >= DateTime.Parse(contentModified.ToString());

这里contentModified本来就是DateTime类型,为什么还要把它转成字符串,然后再转回日期型呢?

我在这里折腾了好长时间,是因为我们取出原始图片最后一次修改的时间精确到毫秒,而通过Request.Headers["If-Modified-Since"];请求的结果是伦敦标准时间,没有毫秒值,所以如果不转换一下就会出现已经缓存的图片,由于毫秒的问题,使return isModifiedSince >= DateTime.Parse(contentModified.ToString()); 返回false,这里转换后将毫秒去掉后就可以正常了。