智能多媒体 API

  • 处理结果另存

    最近更新时间:2017-08-01 09:20:34

    如果是在fop中设置,直接在命令后跟|saveas/SafeBase64(bucket:key)即可 如:

    "persistentOps":"avthumb/mp3/ab/192k|saveas/dGVzdDoxLm1wMw=="
    

    七牛云的数据处理 API 接口均支持如下串行处理规格:

    <DownloadUrl>?<fop1>|<fop2>|<fop3>|<fopN>
    

    可以看到每一步的输出都是下一步的输入,而最后一步的输出即为最终下载到的资源内容。每调用一次这类串行化接口,就必须实时地按序执行所有接口,有可能引起不必要的计算耗时。

    我们提供名为 saveas 的数据处理操作,将处理结果作为资源保存到指定空间内,并赋以指定 Key。保存成功后,下一次可直接通过指定 Key 来访问该资源,以达到提升下载速度的效果。

    接口规格

    saveas/<EncodedEntryURI>/sign/<Sign>
    
    参数名称 必填 类型 说明
    <EncodedEntryURI> string EncodedEntryURI格式组织的目标 Bucket 与 Key
    /sign/<Sign> string 请求签名部分,算法见下方,在 pfop 操作中不用指定该参数

    注意:源Bucket和目标Bucket必须在同一区域,即处理结果不能跨区域另存,例如华东Bucket内的文件经处理后结果无法另存到华北的Bucket。

    签名算法

    1. 在下载 URL(不含 Scheme 部分,即去除 http : //)后附加 saveas 接口(不含签名部分):

    NewURL = URL + "|saveas/<EncodedEntryURI>"
    

    2. 使用 SecretKey 对新的下载 URL 进行HMAC1-SHA1签名:

    Sign = hmac_sha1(SecretKey, NewURL)
    

    3. 对签名进行URL安全的Base64编码

    EncodedSign = urlsafe_base64_encode(Sign)
    

    4. 在新的下载 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。

    示例

    1. 原资源是一个名为 resource/Ship.jpg 的图片:

    http://78re52.com1.z0.glb.clouddn.com/resource/Ship.jpg
    

    2. 将图片做缩略处理:

    http://78re52.com1.z0.glb.clouddn.com/resource/Ship.jpg?imageView2/2/w/200/h/200
    

    3. 对上述云处理结果进行持久化保存:

    #另存操作的目标空间与资源名
    entryURI = "qiniu-developer:Ship-thumb-200.jpg"
    
    #编码结果
    encodedEntryURI = "cWluaXUtZGV2ZWxvcGVyOlNoaXAtdGh1bWItMjAwLmpwZw=="
    
    #需要签名的部分
    signingStr = "78re52.com1.z0.glb.clouddn.com/resource/Ship.jpg?imageView2/2/w/200/h/200|saveas/cWluaXUtZGV2ZWxvcGVyOlNoaXAtdGh1bWItMjAwLmpwZw=="
    
    #签名结果
    sign = "bcgojLbLKTsTlhm3XFMYq0cn3lW2G3NAuJYXZDDf:jGo09Pmq5vyG4c-rRb4qF3_dH1g="
    

    4. 最终得到的完整下载 URL:

    http://78re52.com1.z0.glb.clouddn.com/resource/Ship.jpg?imageView2/2/w/200/h/200|saveas/cWluaXUtZGV2ZWxvcGVyOlNoaXAtdGh1bWItMjAwLmpwZw==/sign/bcgojLbLKTsTlhm3XFMYq0cn3lW2G3NAuJYXZDDf:jGo09Pmq5vyG4c-rRb4qF3_dH1g=
    

    5. 保存转码后资源可通过如下 URL 访问:

    http://78re52.com1.z0.glb.clouddn.com/Ship-thumb-200.jpg
    
    以上内容是否对您有帮助?
  • 提交工单