上传覆盖原图,在web的控制面版里下载的图是最新的,而直接访问的图还是老图,很长时间后,才可以得到新图,是缓存时间的问题吗?
有没有方法可以解决?
另外,当新图可以正常访问之后,通过?imageView
的形式访问图片,所得的图片还是旧图片的缩略图,一直没有更新。试了下更改?imageView
的参数的话,可以直接看到新图的缩略图,有没有可以
覆盖完图片文件之后直接显示最新的图片的api?
完全赞同@安坚实,类似的也可以参考豆瓣用户头像保存策略。
我也一直碰到这个问题,七牛和又拍都是这样。咨询过七牛的客服,也没有得到解决办法。
我估计,七牛和又拍在设计的时候,就没太考虑图片更新的问题,而是主要关注创建、删除等操作。
所以后来我用了这么个解决办法:
- 在创建图片以及每次更新图片前,为其生成一个新的版本号,记录到数据库中。 这个版本号可以是递增的数字,也可以是随机数字/字符
- 创建/更新/访问图片时,把这个版本号加到原本的图片名的后面。 例如图片名是 a.jpg,生成的版本号是 373,实际使用的图片名就是 a_v373.jpg
- 更新完成后,如果需要,可以把上一个版本的图片删除
有一个实际案例。我做了一个商品管理系统,每个商品有一个图片,这个图片是会经常更新的。
我的数据库就这样设计:
goods
id int
name varchar(50)
price int
pic_ver int
生成HTML时就是(伪代码):
for goods in goods_list:
print '<img src="{goods.name}_v{goods.pic_ver}.jpg" />'
@安坚实 的做法很正确。为了让客户更好的了解我们的缓存机制,我整理了一篇文章,请大家参考并提提建议或者意见:http://kb.qiniu.com/Qiniu-Cloud-Storage-Cache-Strategy