服务热线:400-0033-166
万商云集 - 企业数字化选用平台

企业首选的

数字选用平台

解决方案:七牛云存储使用中一些常见问题

2020-12-31 09:49:42 阅读(170 评论(0)

599错误处理如果htp状态码在与七牛的互动中出现599错误,一句话,不要犹豫,直接联系七牛的技术支持。七牛的文件也在很多地方提到了这个错误,指导大家联系技术支持。作者是在分块上传mkfile调用后出现的,联系技术支持后,说是调整了一下,让我重试。后来就好了...分块上传无法从回调中获得文件的原始名称简单上传为multipart/form-通过data上传,七牛服务器可以从请求中获得文件的原始名称,并支持使用魔法变量$(fname)回调业务服务器。然而,当使用分片上传时,情况会有所不同。分片上传需要在最后调用mkfile拼接分片。然而,mkfile接口支持普通请求,没有附带文件名,因此七牛无法获得文件名。此时,从$(fname)中间拿不到文件名。我还向七牛技术支持提交了这个问题。结果是使用自定义变量mkfile支持将自定义变量放入url中,并在回调时将自定义变量传输给业务服务器。谨慎使用图片预处理七牛云支持许多文件预处理,其中最常用的应该是图片预处理,可以改变图片的大小等。七牛建议通过GET直接指定图片处理结果的url,如下:http://qiniuphotos.qiniudn.com/gogopher.jpg?imageview2/1/1w/200/h/200处理后的图像将自动缓存,用户不必在意,只要每次访问都使用此URL即可。然而,一开始,为了保持与其他文件形式统一的处理方法,作者使用了图片预处理(因为视频只能预处理),即在标签中指定了预处理。这时,问题出现了。从后台的日志可以看出,图片的预处理通知回调比正常上传的成功回调要快!在预处理结果到来之前,我的业务服务器数据库中没有这样的图片,预处理结果无法保存。因此,建议使用url直接处理。图片应谨慎使用。预处理视频文件不能快速播放。通常,用户在观看视频时会根据自己的喜好快速将视频定位到指定时间。要实现这一功能,视频本身需要关键帧信息,服务端需要支持关键帧播放请求。但笔者发现,使用七牛云转换后的视频是无效的。因此,通过咨询技术支持,答案是转换文件具有关键帧,但七牛使用CDN加速,因此关键帧需要CDN的支持。如果您想使用此功能,您需要单独联系销售或技术支持在CDN上配置,这需要很长时间。作者联系了销售和技术支持,说是为了帮助我配置,但到目前为止还没有完成,因为最近这并不是特别重要,所以没有跟进。Callback校准是可选步骤。由于七牛云在上传完成后会回调业务服务器,因此理论上,业务服务器需要验证此回调的合理性。七牛文档中有一些原理,需要HMAC-SHA1签名函数。然而,七牛的SDK没有提供直接的验证方法。在研究文档、多次失败和查看SDK源代码后,作者终于成功验证了它。关键区别在于文档中的这句话:获取明文:data=Request.URL.Path ”\n” Request.Body这里的Requesttt.URL.Path是否包含Querystring?答案是包含的!以下是作者C#服务端的验证代码,使用ASP.NETWebApi:C#Code复制内容到剪贴板byte[] key = System.Text.Encoding.UTF8.GetBytes(Qiniu.Conf.Config.SECRET_KEY);  using (HMACSHA1 hmac = new HMACSHA1(key))  {      var t = filterContext.Request.Content.ReadAsStringAsync();      t.Wait();      string rawbody = t.Result;      log.DebugFormat("request's rawbody : {0}", rawbody);      string text = filterContext.Request.RequestUri.PathAndQuery   "\n"   rawbody;      log.DebugFormat("PathAndQuery   \\n   rawbody : {0}", text);      byte[] digest = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(text));      string computed = Qiniu.Util.Base64URLafe.Encode(digest);      log.DebugFormat("Computed hash after base64 : {0}", computed);      IEnumerable<string> auths;      if (filterContext.Request.Headers.TryGetValues("Authorization", out auths) && auths.Count() == 1)      {          string auth = auths.First();          log.DebugFormat("Authorization in header : {0}", auth);          if (auth.StartsWith("QBox "))          {              var arr = auth.Substring(5).Split(':');            if (arr.Length == 2)            {                if (arr[1] != computed)                {                    log.ErrorFormat("Authorization failed. Since auth from header {0} not equals computed {1}", arr[1], computed);                }                else                {                    log.Debug("Authorization success.");                    //only pass can be return                    return;                }   

内容来源:网络,以上内容来源于网络,不代表本站观点,如有侵权,请联系删除。

最新文章