想用七牛的私有图片下载,但不知道如何减少下载token的计算?

目前在做一个app,是一个轻量的论坛社区。因为图片都是比较隐私的,所以打算用七牛的图片存储。

在开发的过程中遇到一个问题,就是什么时候把图片的下载token发给客户端。

比如用户请求一篇文章,假设这篇文章里面有很多张图片。我设想的方案是在用户每次请求文章的时候,把图片地址拿出来算token,然后返回拼接好的连接地址给客户端。

不过如果我在server有做文章的缓存的话,就无法更新token值了。因为一旦缓存起来,请求直接返回缓存内容。

我设想的方案是把server端的缓存失效时间算短一点,只要比之前生成的下载token的过期时间更短,应该就不会出现问题。

不知道大家在用私有图片下载token的过程中有没遇到类似的问题,又是如何解决的呢?

阅读 4.9k
2 个回答

有个方法,看合适不:
图片地址:http://site/qinuimg/1.jpg
骑牛地址:http://qiniu/1.jpg

在文章内插入图片地址,这样缓存不缓存没关系.因为地址一直不变.在服务器端对图片请求做301,即用户访问图片地址时返回301转到有效的骑牛地址+token

//服务器端判断
string HT = Request.HttpMethod.ToLower();
string Url = Request.RawUrl.ToLower().TrimStart('/');

if (HT == "get" && Url.Contains("http://site/qinuimg/"))
{
      string QiniuUrl = Url.Replace("http://site/qinuimg/", "http://qiniu/");
      string TokenUrl = MakeNewToken(QiniuUrl);//可以是直接生成新token,也可以是生成一个后缓存一段时间,这段时间内根据QiniuUrl从缓存读
      Response.RedirectPermanent(TokenUrl, true);//301跳
      return;
}

因为骑牛本身的缓存方式,是跟骑牛地址关联的,所以每次用户访问都可以使用到骑牛的cdn加速.

缺点一: 就是会产生大量的301请求,增加服务器端的请求量,不过量少(1万IP每日)的话没啥影响,因为根本不需要多少性能处理.量大可以考虑单独一台低配服务器,配和独立的图片二级域名.

缺点二: 文章中图片数量过多(100张以上),会延长网页整体加载时间,数量少也没影响的

目前七牛私有资源的缓存机制是这样的将 url 的 query string 部分里的 e 和 token 对去除后,剩余 url 作为资源的缓存 url,但是请求中没有发现 e 和 token 这两个 query string,那么立刻回源(不带 etag),源站通常会返回 401。

所以你重新生成token虽然完整的url可能不一样,但是资源文件还是会被缓存下来的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进