音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

七牛云存储使用中一些常见问题的解决经验
日期:2021-09-08 17:40:40   来源:脚本之家

599错误处理
如果在与七牛的交互中出现http状态码为599的错误,一句话,不要犹豫,直接联系七牛技术支持。七牛的文档也在很多地方提到这个错误,都是指导大家去联系技术支持的。笔者是在分块上传后的mkfile调用时出现的,联系技术支持后,说是调整了一下,让我重试。后来就好了…

分块上传无法从回调中获得文件的原始名
简单上传采用的是multipart/form-data方式上传,七牛服务端能够从请求中获得文件的原始名,并支持使用魔法变量$(fname)回调业务服务器。不过当使用分片上传的时候情况有所不同。分片上传需要在最后调用mkfile,来将分片拼接起来。但是,mkfile接口支持普通的请求,并没有附带文件名,所以七牛也就无法获得文件名,此时从$(fname)中是取不到文件名的。这个问题我也向七牛技术支持提交了问题,得到的结果是使用自定义变量mkfile支持将自定义变量放在url中,回调的时候自定义变量可以传递给业务服务器。

慎用图片预处理
七牛云支持很多对文件的预处理,其中最常用的应该就是图片预处理了,可以对图片的大小做变换等。七牛推荐使用GET的方式直接指定图片处理结果的url,像这样:

http://qiniuphotos.qiniudn.com/gogopher.jpg?imageView2/1/w/200/h/200
处理后的图片会自动缓存,用户不用关心,只要每次访问都用这个url就行了。然而,笔者在开始的时候,为了保持与其他文件形式统一的处理方法,对图片使用了预处理(因为视频什么的只能预处理),即在token中指定了预处理。此时问题出现了,从后台的日志看到,图片的预处理通知回调竟然比正常的上传成功回调还要快!这就导致预处理结果到来之前,我的业务服务器的数据库中还没有这个图片,无法保存预处理结果了。所以推荐还是使用url直接处理,对图片要慎用预处理

视频文件无法快进播放
通常用户在观看视频的时候都会根据自己的喜好,快速将视频定位到指定的时间播放。实现这个功能,需要视频本身有关键帧信息、服务端需要支持关键帧播放请求。

但是笔者发现,在使用七牛云转化后的视频,这样做是无效的。于是咨询技术支持,得到的答案是:转化的文件是具有关键帧的,但七牛使用CDN加速,所以关键帧请求需要CDN的支持,如果想要用这个功能的话,需要单独联系销售或技术支持在CDN上配置,而且时间比较长。笔者联系了销售和技术支持,说是帮我配置,但到现在还没有搞定,因为最近这个也不是特别重要,所以也没有跟下去。

Callback校验
这是可选的一个步骤。由于七牛云会在上传完成之后回调业务服务器,所以理论上说业务服务器需要校验这个回调的合理性。原理在七牛的文档中有,需要用到HMAC-SHA1签名函数。但是七牛的sdk中没有提供直接的方式来做校验,在研读文档、多次失败和查看sdk源码后,笔者终于校验成功了。关键的分歧在于,文档中的这句话:

获取明文:data = Request.URL.Path +”\n” +Request.Body
这里的Request.URL.Path是否包含Querystring?答案是包含的!下面是笔者C#服务端的校验代码,使用的是ASP.NET Web Api:

C# Code复制内容到剪贴板
  1. byte[] key = System.Text.Encoding.UTF8.GetBytes(Qiniu.Conf.Config.SECRET_KEY);   
  2. using (HMACSHA1 hmac = new HMACSHA1(key))   
  3. {   
  4.     var t = filterContext.Request.Content.ReadAsStringAsync();   
  5.     t.Wait();   
  6.     string rawbody = t.Result;   
  7.     log.DebugFormat("request's rawbody : {0}", rawbody);   
  8.     string text = filterContext.Request.RequestUri.PathAndQuery + "\n" + rawbody;   
  9.     log.DebugFormat("PathAndQuery + \\n + rawbody : {0}", text);   
  10.     byte[] digest = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(text));   
  11.     string computed = Qiniu.Util.Base64URLSafe.Encode(digest);   
  12.     log.DebugFormat("Computed hash after base64 : {0}", computed);   
  13.   
  14.     IEnumerable<string> auths;   
  15.     if (filterContext.Request.Headers.TryGetValues("Authorization"out auths) && auths.Count() == 1)   
  16.     {   
  17.         string auth = auths.First();   
  18.         log.DebugFormat("Authorization in header : {0}", auth);   
  19.         if (auth.StartsWith("QBox "))   
  20.         {   
  21.             var arr = auth.Substring(5).Split(':');  
  22.             if (arr.Length == 2)  
  23.             {  
  24.                 if (arr[1] != computed)  
  25.                 {  
  26.                     log.ErrorFormat("Authorization failed. Since auth from header {0} not equals computed {1}", arr[1], computed);  
  27.                 }  
  28.                 else  
  29.                 {  
  30.                     log.Debug("Authorization success.");  
  31.                     //only pass can be return  
  32.                     return;  
  33.                 }  
  34.             }  
  35.             else  
  36.             {  
  37.                 log.Error("Callback Authorization's format is invalid, can not find two part after split by ':'.");   
  38.             }   
  39.         }   
  40.         else  
  41.         {   
  42.             log.Error("Callback Authorization's format is invalid, missing leading 'QBox '.");   
  43.         }   
  44.     }   
  45.     else  
  46.     {   
  47.         log.Error("The request from qiniu callback is missing 'Authorization'");   
  48.     }   
  49.   
  50.     filterContext.Response = filterContext.Request.CreateResponse(System.Net.HttpStatusCode.Forbidden);   
  51.   
  52. }  

如下几个注意点:

明文应当是请求的path+querystring部分和rawbody
对于.NET而言,明文和key都需要用UTF-8编码变换成字节才能进行签名。而php中的hash_hmac函数完全不用这么复杂…
签名的结果再用base64的url安全的方式编码,再与请求的http头部的Authorization比较
建议官方在文档中加入一些相对底层一些的编程语言的实现,php太高端了…

js-sdk实现略显粗糙
在使用过程中,我发现官方的js-sdk有几个我觉得不好的地方:

不能为每个文件获取UpToken

试想,在文件上传过程中有获取UpToken是必须的,而且UpToken又需要包含预处理指令,不同的文件显然需要不同的UpToken,而在js-sdk的实现中,只在初始化这个上传组件对象的时候请求一次上传凭证,后面所有的上传都需要使用这个预先得到的UpToken:

JavaScript Code复制内容到剪贴板
  1. uploader.bind('Init'function(up, params) {      
  2.     getUpToken();      
  3. });     
于是我修改了这部分,在BeforeUpload事件中请求UpToken。建议官方考虑更改这个地方

只能实现分片上传,无法断点续传

js-sdk的实现在分片上传的实现上,是很简单的,不仅没有使用分片,而是分块(一块4m,调用mkblk),而且没有实现持久化ctx,或者类似的回调或接口。4m分块这个问题还可以不追究,没有实现持久化ctx就说不过去了,不持久化怎么实现断点续传撒?!就算不实现,也应该给出回调的入口,让调用者来实现持久化,而我实在无法找到这个’空子’可钻,只能直接在源码上改动了。

没有复用流行类库的东西

这个其实算不上问题,因为作为一个不依赖jquery的sdk,当然不能使用jquery现成的东西,比如ajax。不依赖jquery就算了,依赖plupload是几个意思嘛,还依赖全局对象…于是最后,我干脆自己将sdk改成了Backbone的类,将不要的东西统统去掉,使用jquery和underscore简化代码了…

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    网站运营微信营销网络赚钱