有奖捉虫:行业应用 & 管理与支持文档专题 HOT
用户可以通过在上传请求(PUT Object、POST Object、CompleteMultipartUploads)中携带 ReturnBody 参数,在请求返回中获取对象相关信息。

系统变量

上传回调 ReturnBody 支持使用的系统变量如下表所示:
注意:
exif、videoinfo、imageinfo 信息的获取依赖数据万象(Cloud Infinite,CI)服务的能力。获取这三类变量,会由 CI 服务收取相应的费用,详情可参考 数据万象计费概述
变量名
变量说明
是否包含子变量
是否必选
bucket
对象上传的目标存储桶。
object
对象上传到存储桶内,使用的对象名称。
size
对象大小,单位为 Byte。
region
对象上传的存储桶所在地域。
mimeType
对象元数据 Content-Type。
exif
如果上传的对象为图片类型,支持查看图片的 exif 信息,变量填写格式为 ${exif.子变量}
注意:
为了避免 ReturnBody 携带的内容太多,影响接口性能,不支持直接填写${exif},必须写明具体的子变量。

videoInfo
如果上传的对象为音视频类型,支持查看音视频资源的元信息。变量填写格式为 ${videoInfo.子变量}
注意:
为了避免 ReturnBody 携带的内容太多,影响接口性能,不支持直接填写${imageInfo},必须写明具体的子信息项。

imageInfo
如果上传的对象为图片类型,支持查看图片的基本信息,变量填写格式为 ${imageInfo.子变量}
注意:
为了避免 ReturnBody 携带的内容太多,影响接口性能,不支持直接填写${videoInfo},必须写明具体的子变量。

其中,使用 exif、imageInfo、videoInfo 变量时,需要注意以下几点:
这三类变量仅支持在国内公有云地域使用。
获取这三类变量依赖数据万象(Cloud Infinite,CI)服务的能力。用户需要开通 CI 服务,并保证 COS 服务角色有权调用 CI 服务。获取这三类变量,会由CI 服务收取相应的费用,详情可参考 数据万象计费概述
支持子变量,例如${变量名.子变量}${变量名.二级子变量}。并且,为了避免 ReturnBody 携带的内容太多,影响接口性能,不支持直接填写${imageInfo},必须写明具体的子变量。
变量支持的具体子变量,可参考数据万象和媒体处理服务的产品文档:
videoInfo:获取媒体信息

使用步骤

步骤一:构造 ReturnBody 参数

1. 将希望获取的对象信息以 json 格式表示。如下示例中 bucket、key、myfilesize、height 为用户可自定义的参数名称,变量名使用 ${}包裹,变量名对应的值是需要获取的回调信息。ReturnBody 支持的变量名,请参见上方的 系统变量。示例如下:
{
"bucket": "${bucket}",
"key": "${object}",
"myfilesize": "${size}",
"height": "${imageInfo.height}"
}
2. 将以上 json 格式转换为字符串,并进行 Base64 编码。
eyJidWNrZXQiOiAiJHtidWNrZXR9IiwgImtleSI6ICIke29iamVjdH0iLCAibXlmaWxlc2l6ZSI6ICIke3NpemV9IiwgImhlaWdodCI6ICIke2ltYWdlSW5mby5oZWlnaHR9In0=

步骤二:在上传对象的请求中携带 ReturnBody 参数

1. PUT Object 请求中,通过请求头部 x-cos-return-body 传入 Base64 编码的结果。请求示例如下:
PUT /<ObjectKey> HTTP/1.1
Host: <BucketName-APPID>.cos.<Region>.myqcloud.com
Date: GMT Date
Content-Type: Content Type
Content-Length: Content Length
Content-MD5: MD5
x-cos-return-body: eyJidWNrZXQiOiAiJHtidWNrZXR9IiwgImtleSI6ICIke29iamVjdH0iLCAibXlmaWxlc2l6ZSI6ICIke3NpemV9IiwgImhlaWdodCI6ICIke2ltYWdlSW5mby5oZWlnaHR9In0=
Authorization: Auth String

[Object Content]
2. POST Object 请求中,通过表单字段 x-cos-return-body 传入 Base64 编码的结果。
POST / HTTP/1.1
Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.com
Date: Thu, 29 Aug 2019 07:39:34 GMT
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZBPbaoYE2gqeB21N
Content-Length: 1119
Connection: close

------WebKitFormBoundaryZBPbaoYE2gqeB21N
Content-Disposition: form-data; name="key"

exampleobject
------WebKitFormBoundaryZBPbaoYE2gqeB21N
Content-Disposition: form-data; name="x-cos-return-body"

eyJidWNrZXQiOiAiJHtidWNrZXR9IiwgImtleSI6ICIke29iamVjdH0iLCAibXlmaWxlc2l6ZSI6ICIke3NpemV9IiwgImhlaWdodCI6ICIke2ltYWdlSW5mby5oZWlnaHR9In0=
------WebKitFormBoundaryZBPbaoYE2gqeB21N
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg

[Object Content]
------WebKitFormBoundaryZBPbaoYE2gqeB21N--
3. Complete Multipart Uploads 请求中,通过请求头部 x-cos-return-body 传入 Base64 编码的结果。
POST /exampleobject?uploadId=UploadId HTTP/1.1
Host: exmaplebucket-1250000000.cos.region.myqcloud.com
x-cos-return-body: eyJidWNrZXQiOiAiJHtidWNrZXR9IiwgImtleSI6ICIke29iamVjdH0iLCAibXlmaWxlc2l6ZSI6ICIke3NpemV9IiwgImhlaWdodCI6ICIke2ltYWdlSW5mby5oZWlnaHR9In0=
Date: GMT Date
Content-Type: application/xml
Content-Length: Content Length
Content-MD5: MD5
Authorization: Auth String

[Request Body]

步骤三:获取请求返回中的 ReturnBody 信息

1. PUT Object 的返回,将按照 json 格式在响应体中返回对象信息。响应示例如下:
HTTP/1.1 200 OK
x-cos-request-id: NWU5MDNkZjVfYzVjNzJhMDlfMjVhNzNfMWMy****

{
"bucket": "examplebucket-1250000000000",
"key": "test.jpeg",
"size": 214513
}
2. POST Object 的返回,将按照 json 格式在响应体中返回对象信息。响应示例如下:
HTTP/1.1 201 OK
x-cos-request-id: NWU5MDNkZjVfYzVjNzJhMDlfMjVhNzNfMWMy****

{
"bucket": "examplebucket-1250000000000",
"key": "test.mp4",
"video_duration": 1000,
"video_numFrames": 1000
}
3. Complete Multipart Uploads 请求本身返回了 xml 请求体,其中包含了分块上传的相关的重要信息。因此,ReturnBody 相关信息(对象信息、ReturnBody 计算是否成功等)会被放在 XML 字段 ReturnBodyResult 中,返回给用户。
ReturnBodyResult 节点说明如下:
节点名称(关键字)
父节点
描述
类型
ReturnBodyResult
CompleteMultipartUploadResult
ReturnBody 的结果信息。
Container
Status
CompleteMultipartUploadResult.ReturnBodyResult
ReturnBody 获取是否成功。枚举值支持 200、203。
200表示上传成功、获取 ReturnBody 成功;
203表示上传成功,获取 ReturnBody 失败。
Integer
Error
CompleteMultipartUploadResult.ReturnBodyResult
Status 为203时,说明获取 ReturnBody 失败。返回 Error,说明回调失败信息。
Container
Code
CompleteMultipartUploadResult.ReturnBodyResult
回调失败信息的错误码,例如 GetReturnBodyFailed。
String
Message
CompleteMultipartUploadResult.ReturnBodyResult
ReturnBody 获取失败的错误信息。
String
ReturnBody
CompleteMultipartUploadResult.ReturnBodyResult
Status 为200时,说明上传成功、回调成功,返回 ReturnBody。内容为 ReturnBody 的 json 字符串 base64 编码后的字符串。
String
响应示例如下:
HTTP/1.1 200 OK
Content-Type: application/xml

<CompleteMultipartUploadResult>
<Location>http://examplebucket-1250000000.cos.ap-beijing.myqcloud.com/exampleobject</Location>
<Bucket>examplebucket-1250000000</Bucket>
<Key>exampleobject</Key>
<ETag>"aa259a62513358f69e98e******"</ETag>
<ReturnBodyResult>
<Status>200|203</Status>
<!--Status为203时,说明ReturnBody失败,返回 Error-->
<Error>
<Code>GetReturnBodyFailed</Code>
<Message>Invalid return body params.</Message>
</Error>
<!--Status为200时,说明上传成功、ReturnBody计算成功,返回 json 字符串 base64 编码后的结果。-->
<ReturnBody>
eyJhIjogImIifQ==
</ReturnBody>
</ReturnBodyResult>
</CompleteMultipartUploadResult>

返回码

在上传请求中使用 ReturnBody 参数后,返回码主要有以下几种情况:
上传请求成功,获取 ReturnBody 成功,返回200。
上传请求成功,获取 ReturnBody 失败:
失败原因
返回码
ErrorCode
Message
ReturnBody 参数不合法。
203
GetReturnBodyFailed
Invalid return body params.
调用数据万象服务,由于访问无权限、未开通服务等原因导致参数获取失败。
203
GetReturnBodyFailed
Error status from ci: ${code}, should return 200 OK.
其中,${code}为数据服务返回的错误码,例如 400、403等。
上传失败。将不会触发 ReturnBody 计算,返回的错误码和信息遵循普通上传请求的规则。

最佳实践