首页  ·  知识 ·  
Label
      编辑:  图片来源:网络

实现原理:

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

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

最后,两个时间比较,如果本地缓存的时间大于原始图片最后一次修改的时间,那么就告诉浏览器本地已经有这个文件了,不用再去请求了,将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,这里转换后将毫秒去掉后就可以正常了。

本文作者:网友 来源: http://www.cnblogs.com/Lewis/archive/2010/06/11/1756527.html
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的
收藏至微信