使用上传回调获取对象信息
使用场景
您可以通过回调,获取对象上传后的相关信息,例如获取对象是否上传成功,获取对象Etag、上传后大小、上传后对象所在桶等信息。OBS支持通过回调获取对象的系统参数和自定义参数,参数详情可参考API参考的回调章节。
上传回调的详细流程如图1所示,主要分为以下几个阶段:
- 客户端发出上传对象请求,请求中携带回调参数。
- OBS接收到客户端的上传请求,执行上传对象操作。对象上传成功后,OBS封装回调请求。
- OBS调用回调接口,向回调服务器发起回调请求。
- 回调服务器得到上传对象完成的通知,完成数据更新,处理回调请求。
- 回调服务器将回调响应数据返回给OBS。
- OBS将上传对象请求的响应结果返回给客户端,响应结果中携带回调数据。
约束与限制
- 目前只在POST上传对象、PUT上传对象以及合并段API中支持回调功能。
- 在对象上传成功之后才会回调特定服务器,如果对象上传失败则不会回调。
- 如果上传的图片大小超过25M,则无法通过imageInfo相关系统变量获取图片基本信息,会导致回调失败。
使用方式
OBS支持通过API、SDK方式使用上传回调,不支持通过管理控制台、OBS Browser+、obsutil方式使用上传回调。
回调签名验证
如果您在上传对象请求中设置回调参数,OBS在对象上传成功之后,将上传结果回调特定服务器,并将回调结果返回给您。回调结果中包含签名信息,以下介绍如何校验回调结果中的签名信息。
OBS回调您的服务器时,会在请求头中携带“Authorization”和 “x-signature-time”。您可以使用自己的SK重新计算签名,与请求头中的签名比对,验证请求确实来自OBS。
验证签名主要分为以下四步:
- 从回调请求头取出“x-signature-time”的值。
- 拼接待签名字符串:回调URL路径 + 换行 + 回调body体替换后的内容 + 换行 + x-signature-time
回调URL路径 回调body体替换后的内容 x-signature-time
回调body体中的变量在回调时会被替换为实际值,替换规则如表1:
- 使用SK对待签名字符串做HMAC-SHA256,再做Base64编码。
- 比对计算结果与“Authorization”中“OBS <AK>:”后面的签名,如果一致则验证通过。
以下通过示例来介绍如何校验回调结果中的签名信息:
| 对比项 | 示例一 | 示例二 | 示例三 |
|---|---|---|---|
| 上传方式 | POST | POST | PUT |
| 回调body体类型 | application/x-www-form-urlencoded | application/json | application/json |
| 回调body体模板 | fsize=$(fsize)&fname=$(fname) | {"fsize": "$(fsize)", "fname": "$(fname)"} | bucket=$(bucket)&object=$(key) |
| $(fname)替换 | Base64编码 | 原始值 | 原始值 |
| StringToSign中的格式 | key=value | {"key": "value"} | key=value |
- StringToSign中的回调body体替换后的内容和您配置的模板格式保持一致,即如果您配置的回调body体为“bucket=$(bucket)&object=$(key)”,则替换后的内容为“bucket=桶名&object=对象名”,不会因为回调body体类型为“application/json”就自动转成JSON格式。回调body体类型只影响回调请求的Content-Type和请求体格式,不影响签名计算。
- 中文对象名与英文对象名的签名逻辑完全一致,仅替换后的输入值不同。application/x-www-form-urlencoded类型下,中文对象名经Base64编码后回调参数通过URL传递,可能会由于中文被二次编码而产生编码问题,因此建议中文场景优先使用application/json类型。
- PUT上传和POST上传的签名算法完全一样。签名算法始终是“Base64(HMAC-SHA256(SK, StringToSign))”,区别仅在于回调配置的传递方式:POST通过 Policy表单字段,PUT通过“x-obs-callback”请求头。

