处理结果另存(saveas)
描述
七牛云存储的云处理API接口均支持如下串行处理规格:
<DownloadUrl>?<fop1>|<fop2>|<fop3>|<fopN>
可以看到每一步的输出都是下一步的输入,而最后一步的输出即为最终下载到的资源内容。
每调用一次这类串行化接口,就必须实时地按序执行所有接口,有可能引起不必要的计算耗时。
我们提供名为saveas
的云处理操作,将云处理结果作为资源保存到指定空间内,并赋以指定Key。保存成功后,下一次可直接通过指定Key来访问该资源,以达到提升下载速度的效果。
接口规格
saveas/<EncodedEntryURI>/sign/<Sign>
参数名称 | 必填 | 类型 | 说明 |
<EncodedEntryURI> |
是 | string | 以EncodedEntryURI格式组织的目标Bucket与Key |
/sign/<Sign> |
是 | string | 请求签名部分,算法见下方 在pfop操作中不用指定该参数 |
签名算法
算法描述
在下载URL(不含Scheme部分,即去除
http://
)后附加saveas
接口(不含签名部分):NewURL = URL + "|saveas/<EncodedEntryURI>"
使用
SecretKey
对新的下载URL进行HMAC1-SHA1签名:Sign = hmac_sha1(SecretKey, NewURL)
对签名进行URL安全的Base64编码:
EncodedSign = urlsafe_base64_encode(Sign)
在新的下载URL后拼接签名参数:
FinalURL = NewURL + "/sign/<AccessKey>:<EncodedSign>"
算法实例
生成saveas请求的完整Go代码如下:
func makeSaveasUrl(URL, accessKey string, secretKey []byte, saveBucket, saveKey string) string {
encodedEntryURI := base64.URLEncoding.EncodeToString([]byte(saveBucket+":"+saveKey))
URL += "|saveas/" + encodedEntryURI
h := hmac.New(sha1.New, secretKey)
// 签名内容不包括Scheme,仅含如下部分:
// <Domain>/<Path>?<Query>
u, _ := url.Parse(URL)
io.WriteString(h, u.Host + u.RequestURI())
d := h.Sum(nil)
sign := accessKey + ":" + base64.URLEncoding.EncodeToString(d)
return URL + "/sign/" + sign
}
附注
urlsafe_base64_encode()
函数按照标准的 RFC 4648 实现,开发者可以参考 github.com/qiniu 上各SDK的样例代码。- 此处签名内容不包含Scheme部分,与DownloadToken签名不一样。
- 当要持久化保存的fop耗时较长时候,saveas请求会返回CDN超时,但是只要保证发送的saveas请求合法,七牛服务器还是会对请求做正确处理。
- 大多数使用场景下,建议使用触发持久化处理接口来实现处理结果持久存储,避免使用同步操作的
saveas
接口,提升访问速度。 - c# http库发送请求的时候会把 | 转成 %7c,由于签名签的是 | ,导致报400错误,可以在发送请求的时候url中把 | 改为 %7c 或者签名的时候签 %7c 两种方法解决
示例
原资源是一个图片:
http://developer.qiniu.com/resource/Ship.jpg
将图片做缩略处理:
http://developer.qiniu.com/resource/Ship.jpg?imageView/2/w/200/h/200
对上述云处理结果进行持久化保存:
另存操作的目标空间与资源名 entryURI = "t-test:Ship-thumb-200.jpg" 编码结果 encodedEntryURI = "dC10ZXN0OlNoaXAtdGh1bWItMjAwLmpwZw==" 需要签名的部分 signingStr = "developer.qiniu.com/resource/Ship.jpg?imageView/2/w/200/h/200|saveas/dC10ZXN0OlNoaXAtdGh1bWItMjAwLmpwZw==" 签名结果 sign = "iguImegxd6hbwF8J6ij2dlLIgycyU4thjg-xmu9q:38kMkgw3We96NWSgUHJz9C72noQ="
最终得到的完整下载URL:
http://developer.qiniu.com/resource/Ship.jpg?imageView/2/w/200/h/200|saveas/dC10ZXN0OlNoaXAtdGh1bWItMjAwLmpwZw==/sign/GeKdDZhpPh6rxoVNCSrvygimGSdH7jOUvalFGZrp:2IrwcEm4nxGQGi4LOpNIdPImlpE=
保存转码后资源可通过如下URL访问:
http://developer.qiniu.com/resource/Ship-thumb-200.jpg
如果有任何问题,请进入 七牛云存储问答社区 或者发送 工单 咨询