使用二级域名,如果正式上线的话就需要走备案流程,审核通过后才能使用
2、关于七牛云存储自定义URL的问题
近段时间将使用七牛云存储来存放用户上传的数据,客户端通过七牛的js-sdk与七牛交互,服务端C#实现了七牛相关的接口。在这过程中多多少少遇到点问题,在这里总结一下。原文: 使用七牛云存储的一些经验总结
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#
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.Base64URLSafe.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;
}
}
else
{
log.Error("Callback Authorization's format is invalid, can not find two part after split by ':'.");
}
}
else
{
log.Error("Callback Authorization's format is invalid, missing leading 'QBox '.");
}
}
else
{
log.Error("The request from qiniu callback is missing 'Authorization'");
}
filterContext.Response = filterContext.Request.CreateResponse(System.Net.HttpStatusCode.Forbidden);
}
如下几个注意点:
- 明文应当是请求的path+querystring部分和rawbody
- 对于.NET而言,明文和key都需要用UTF-8编码变换成字节才能进行签名。而php中的hash_hmac函数完全不用这么复杂...
- 签名的结果再用base64的url安全的方式编码,再与请求的http头部的Authorization比较
建议官方在文档中加入一些相对底层一些的编程语言的实现,php太高端了...
## js-sdk实现略显粗糙 ##
在使用过程中,我发现[官方的js-sdk](https://github.com/qiniupd/qiniu-js-sdk/)有几个我觉得不好的地方:
**不能为每个文件获取UpToken**
试想,在文件上传过程中有获取UpToken是必须的,而且UpToken又需要包含预处理指令,不同的文件显然需要不同的UpToken,而在js-sdk的实现中,只在初始化这个上传组件对象的时候请求一次上传凭证,后面所有的上传都需要使用这个预先得到的UpToken:
```javascript
uploader.bind('Init', function(up, params) {
getUpToken();
});
于是我修改了这部分,在 BeforeUpload 事件中请求UpToken。建议官方考虑更改这个地方
只能实现分片上传,无法断点续传
js-sdk的实现在分片上传的实现上,是很简单的,不仅没有使用分片,而是分块(一块4m,调用mkblk),而且没有实现持久化ctx,或者类似的回调或接口。4m分块这个问题还可以不追究,没有实现持久化ctx就说不过去了,不持久化怎么实现断点续传撒?!就算不实现,也应该给出回调的入口,让调用者来实现持久化,而我实在无法找到这个'空子'可钻,只能直接在源码上改动了。
没有复用流行类库的东西
这个其实算不上问题,因为作为一个不依赖jquery的sdk,当然不能使用jquery现成的东西,比如ajax。不依赖jquery就算了,依赖plupload是几个意思嘛,还依赖全局对象...于是最后,我干脆自己将sdk改成了Backbone的类,将不要的东西统统去掉,使用jquery和underscore简化代码了...
3、是不是CDN都需要域名是备案过的?
国内的cdn服务商原则上接入域名需要备案,不备案允许接入的运营商不符合规定
国外的cdn服务商没有这个要求
4、为什么域名备案了云主机还要备案?有没有域名备案了云主机不再用备案的IDC?
现在统一为网站备案,包括域名和主机。用哪儿的国内主机就要在哪儿备案。不过,你可以用国际版,这个不要求备案。
建议你用模板建站系统做网站,不懂技术也能自己动手制作网站。有专业人员维护后台系统,让用户无后顾之忧。
有几百套网站模板可以选择,操作方便,管理和维护很方便,有学习视频,一般看半天就会做了。
速成网站-国际版(5G 阿里云香港主机,不限流量,不需要备案,会打字就可以做网站,可先试用)。年费是160元。
可以找咱们,现在在线。
5、云服务器使用一定要域名和备案吗
国内的空间是必须备案的。国外或香港的空间不用备案,也不能备案。
6、是域名必须要备案才能用么?
您好,并不是这样的,域名备案是我国为了防止网络诈骗,有效的监管网络的一种手段,只要在我国使用我国的服务器的做网站,才会牵涉到域名备案。
如果您是使用了国外的服务器或者大陆以外的服务器,要按照当地对于域名的规范法则来进行相关的工作。
7、七牛云绑定自定义域名时要填备案号,但是域名怎么备案啊
你的空间在那里购买的,就在那里备案。
比如:
你的域名在阿里云,空间也在阿里云,那就在阿里云备案;
如果域名在阿里云,空间在新网,那就在新网备案;
阿里云的备案地址是下面这个:
8、我买了一个云服务器,需要备案,是不是备案域名啊是
所谓的云服务器备案,特指国内云服务器。大陆以外地域的服务器不用。
备案是备案服务器,包括 IP地址。
备案过程一般有云服务器商提供辅助,会给你操作步骤,你按照步骤一点点去操作就行了, 准备好相关备案资料就行。
以国内的阿里云为例子,官方文档对网站备案有详细描述。感兴趣可以去看看。
因为备案是一个系统的过程,不是一句两句话能讲清楚的。而官方文档中对此解释的很详细,即使是新手用起来也很友好。
9、以后网站没有备案就不能用CDN服务了吗?
7 月 6 日,工业和信息化部信息通信管理局下发《关于进一步加强未备案网站管理工作的通知》,通知要求,各通信管理局要立即组织属地接入服务企业(包含跨地区接入服务企业)开展自查自纠工作,要求其立即停止为未备案网站提供互联网接入服务(包括加速类服务),并强调加大对未备案接入行为的处罚力度,对于未备案接入网站的行为「零容忍」,发现一起,处罚一起。
此次通知是基于工业和信息化部信息通信管理局互联网基础管理专项行动,继续强化网站备案、IP 地址、域名等互联网基础管理,积极打击不法分子通过自动化抢注备案过期域名,通过 CDN 网络从事非法活动,催生黑产的现状。
为维护良好的市场环境,七牛云迅速响应,积极配合通信管理局纠查工作,全面停止对未备案、过期域名的加速服务,并优化 CDN 加速域名备案监管流程,已形成完善的全通道审核及监管机制。
对于依法备案的域名
七牛云独家支持 ECC 算法 DV 单域名证书
免费申请及下载!
申请方式:
登陆七牛云开发者平台 》》portal.qiniu.com》》选择 SSL 证书服务》》点击「购买证书」
10、网站备案,是不是必须申请域名,才可以备案?
网站备案是指网站服务商帮助网站所有人给网站做域名备案。网站所有人需要提供给网站空间服务商备案资料。
基本要求就是要有 域名+服务器。
给域名备案需要网站服务商协助,只有域名是无法备案的。备案针对网站备案,只注册域名不用备案,域名做网站就需要备案,网站空间在哪家购买,哪家就负责办理网站备案。
网站备案需要填写网站域名,还有网站以及管理人员的信息。备案时必须有网站空间接入商,负责接入网站。
网站域名备案时,需在APP端上传主体负责人证件、网站负责人证件、主办单位证件等必须上传的基本资料,辅助资料需根据用户的备案场景和管局规则选择性的上传。本文为您介绍各种资料的适用场景及上传要求,您可参见本文查看并准备备案所需的资料及上传要求,加快备案进程。
办理时间一般在30个工作日之内可以下来,快一点的10多天就能下来备案号。