上传策略(PutPolicy)

上传策略是资源上传时附带的一组配置设定。通过这组配置信息,七牛云存储可以了解用户上传的需求:它将上传什么资源,上传到哪个空间,上传结果是回调通知还是使用重定向跳转,是否需要设置反馈信息的内容,以及授权上传的截止时间等等。

上传策略同时还参与请求验证。实际上,上传凭证(UploadToken)就是上传策略的签名结果。通过对上传策略签名,可以验证用户对某个资源的上传请求是否完整。

格式

{

    "scope":               "<Bucket                   string>",
    "deadline":             <UnixTimestamp            uint32>,
    "insertOnly":           <AllowFileUpdating        int>,

    "saveKey":             "<SaveKey                  string>",

    "endUser":             "<EndUserId                string>",

    "returnUrl":           "<RedirectURL              string>",
    "returnBody":          "<ResponseBodyForAppClient string>",

    "callbackUrl":         "<RequestUrlForAppServer   string>",
    "callbackHost":        "<RequestHostForAppServer  string>",
    "callbackBody":        "<RequestBodyForAppServer  string>",
    "callbackBodyType":    "<RequestBodyTypeForAppServer  string>",
    "callbackFetchKey":    <RequestKeyForApp         int>

    "persistentOps":       "<persistentOpsCmds        string>",
    "persistentNotifyUrl": "<persistentNotifyUrl      string>",
    "persistentPipeline":  "<persistentPipeline       string>",
    "fsizeMin":           <FileSizeMin            int64>,
    "fsizeLimit":           <FileSizeLimit            int64>,

    "detectMime":           <AutoDetectMimeType       int>,

    "mimeLimit":           "<MimeLimit                string>"
    "deleteAfterDays":     "<deleteAfterDays          int>"
}
字段名称 必填 说明
scope 指定上传的目标资源空间(Bucket)和资源键名(Key)。
有两种格式:
<bucket>,表示允许用户上传文件到指定的 bucket。在这种格式下文件只能“新增”,若已存在同名资源则会失败。
<bucket>:<key>,表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”,已存在同名资源则会被本次覆盖。如果希望只能上传指定key的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1
deadline 上传请求授权的截止时间。
Unix时间戳,单位:秒。该截止时间为上传完成后,在七牛空间生成文件的校验时间,而非上传的开始时间,一般建议设置为上传开始时间+3600s,用户可根据具体的业务场景对凭证截止时间进行调整。
insertOnly 限定为“新增”语意。
如果设置为非0值,则无论scope设置为什么形式,仅能以新增模式上传文件。
endUser 唯一属主标识。
特殊场景下非常有用,比如根据App-Client标识给图片或视频打水印。
returnUrl Web端文件上传成功后,浏览器执行303跳转的URL。
通常用于HTML Form上传。
文件上传成功后会跳转到<returnUrl>?upload_ret=<queryString>, <queryString>包含returnBody内容。
如不设置returnUrl,则直接将returnBody的内容返回给客户端。
returnBody 上传成功后,自定义七牛云最终返回給上传端(在指定returnUrl时是携带在跳转路径参数中)的数据。
支持魔法变量自定义变量returnBody 要求是合法的 JSON 文本。
如:{"key": $(key), "hash": $(etag), "w": $(imageInfo.width), "h": $(imageInfo.height)}
callbackUrl 上传成功后,七牛云向App-Server发送POST请求的URL。
必须是公网上可以正常进行POST请求并能响应HTTP/1.1 200 OK的有效URL。另外,为了给客户端有一致的体验,我们要求
callbackUrl 返回包 Content-Type"application/json",即返回的内容必须是合法的 JSON 文本。
出于高可用的考虑,本字段允许设置多个 callbackUrl(用 ; 分隔),在前一个 callbackUrl 请求失败的时候会依次重试下一个
callbackUrl。一个典型例子是 http://<ip1>/callback;http://<ip2>/callback,并同时指定下面的 callbackHost 字段。在 callbackUrl 中使用 ip 的好处是减少了对 dns 解析的依赖,可改善回调的性能和稳定性。
callbackHost 上传成功后,七牛云向App-Server发送回调通知时的 Host 值。
仅当同时设置了 callbackUrl 时有效。
callbackBody 上传成功后,七牛云向App-Server发送Content-Type: application/x-www-form-urlencoded 的POST请求。
该字段App-Server可以通过直接读取请求的query来获得,支持魔法变量自定义变量callbackBody 要求是合法的 url query string。如:key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo.height)
callbackBodyType 上传成功后,七牛云向App-Server发送回调通知callbackBody的Content-Type。
默认为application/x-www-form-urlencoded,也可设置为application/json
callbackFetchKey 是否启用fetchKey上传模式。
0为关闭,1为启用。具体见fetchKey上传模式
persistentOps 资源成功上传后执行的持久化指令列表,每个指令是一个API规格字符串,多个指令用“;”分隔。
请参看详解示例
同时添加persistentPipeline字段,使用专用队列处理,请参考persistentPipeline字段说明。
persistentPipeline 转码队列名,资源上传成功后,触发转码时指定独立的队列进行转码。建议使用专用队列
persistentNotifyUrl 接收预转持久化结果通知的URL。
必须是公网上可以正常进行POST请求并能响应HTTP/1.1 200 OK的有效URL。
该URL获取的内容和持久化处理状态查询的处理结果一致。
发送body格式为Content-Type"application/json"的POST请求,需要按照读取流的形式读取请求的body才能获取。
saveKey 自定义资源名。
支持魔法变量自定义变量。这个字段仅当用户上传的时候没有主动指定key的时候起作用。
fsizeMin 限定上传文件大小最小值,单位:字节(Byte)。
fsizeLimit 限定上传文件大小最大值,单位:字节(Byte)。
超过限制的上传内容会被判为上传失败,返回413状态码。
detectMime 开启MimeType侦测功能。
设为非0值,则忽略上传端传递的文件MimeType信息,使用七牛服务器侦测内容后的判断结果。
默认设为0值,如上传端指定了MimeType则直接使用该值,否则按如下顺序侦测MimeType值:
1. 检查文件扩展名;
2. 检查Key扩展名;
3. 侦测内容。
如不能侦测出正确的值,会默认使用 application/octet-stream
mimeLimit 限定用户上传的文件类型。
指定本字段值,七牛服务器会侦测文件内容以判断MimeType,再用判断值跟指定值进行匹配,匹配成功则允许上传,匹配失败返回403状态码。
示例
● “image/*“表示只允许上传图片类型;
● “image/jpeg;image/png”表示只允许上传jpgpng类型的图片;
● “!application/json;text/plain”表示禁止上传json文本和纯文本。(注意最前面的感叹号)
deleteAfterDays 文件在多少天后被删除,七牛将文件上传时间与指定的deleteAfterDays天数相加,得到的时间入到后一天的午夜(CST,中国标准时间),从而得到文件删除开始时间。例如文件在2015年1月1日上午10:00 CST上传,指定deleteAfterDays为3天,那么会在2015年1月5日00:00 CST之后当天内删除文件。

fetchKey上传模式

上传策略中的callbackFetchKey是指,是否启用fetchKey上传模式,0为关闭,1为启用。 如果启用fetchKey上传模式,上传的key是由回调的结果指定的。如果回调成功,回调服务应对七牛云存储作出类似如下的响应:

{
    "key": <key>,
    "payload": <callback-json-object>
}

七牛云存储将上面的回调结果解析,<key>的字段作为资源的名称存入存储中。<payload>部分返回给客户端。

例如,回调服务对七牛云存储作出如下的响应:

{
    "key": "sunflowerc.jpg",
    "payload": {
        {"success":true,"name":"sunflowerc.jpg"}
    }
}

则七牛将资源的key作为sunflowerc.jpg存入云存储中,返回给客户端的内容为:

{"success":true,"name":"sunflowerc.jpg"} 

persistentOps详解

persistentOps字段用于指定预转数据处理命令和保存处理结果的存储空间与资源名。

为此字段指定非空值,则在成功上传一个文件后,会启动一个异步数据处理任务。 persistentId 字段,唯一标识此任务。 当 returnBody 中指定了 persistentId 魔法变量时,客户端收到的响应内容(returnBody)中会有 persistentId ;当没有指定 returnBody 时,默认也会返回 persistentId

  1. 使用默认存储空间和资源名:

    当只指定了数据处理命令时,服务端会选择上传文件的Bucket作为数据处理结果的存储空间,Key由七牛服务器自动生成。

  2. 使用指定存储空间和资源名:

    在数据处理命令后用管道符 | 拼接 saveas/<encodedEntryURI> 指令,指示七牛服务器使用 EncodedEntryURI 格式中指定的 Bucket 与 Key 来保存处理结果。
    例如avthumb/flv|saveas/cWJ1Y2tldDpxa2V5,是将上传的视频文件转码成flv格式后存储为qbucket:qkey,其中cWJ1Y2tldDpxa2V5qbucket:qkeyURL安全的Base64编码结果。
    以上方式可以同时作用于多个数据处理命令,用“;”分隔,例如avthumb/mp4|saveas/cWJ1Y2tldDpxa2V5;avthumb/flv|saveas/cWJ1Y2tldDpxa2V5Mg==

附注

  • Key必须采用utf-8编码,使用非utf-8编码的资源名访问时会报错。
  • callbackUrlcallbackBody配合使用。
  • returnUrlreturnBody配合使用。
  • callbackXXXreturnXXX不可混用。
  • 文件上传后的命名将遵循以下规则:
    1. 客户端已指定Key,以Key命名;
    2. 客户端未指定Key,上传策略中设置了saveKey,以saveKey的格式命名;
    3. 客户端未指定Key,上传策略中未设置saveKey,以文件hash(etag)命名。

示例

persistentOps与persistentNotifyUrl字段

  1. 上传一个视频资源,并在成功后触发两个预转处理(转成mp4资源和对原资源进行HLS切片):
{
    "scope":                "qiniu-ts-demo",
    "deadline":             1390528576,
    "persistentOps":        "avthumb/mp4;avthumb/m3u8/segtime/15/vb/440k",
    "persistentNotifyUrl":  "http://fake.com/qiniu/notify"
}

内部参考资源

外部参考资源


如果有任何问题,请进入 七牛云存储问答社区 或者发送 工单 咨询