文档首页/ 对象存储服务 OBS/ 用户指南/ 对象管理/ 上传对象/ 使用上传回调获取对象信息
更新时间:2026-07-08 GMT+08:00
分享

使用上传回调获取对象信息

使用场景

您可以通过回调,获取对象上传后的相关信息,例如获取对象是否上传成功,获取对象Etag、上传后大小、上传后对象所在桶等信息。OBS支持通过回调获取对象的系统参数和自定义参数,参数详情可参考API参考的回调章节。

图1 上传回调流程图

上传回调的详细流程如图1所示,主要分为以下几个阶段:

  1. 客户端发出上传对象请求,请求中携带回调参数。
  2. OBS接收到客户端的上传请求,执行上传对象操作。对象上传成功后,OBS封装回调请求。
  3. OBS调用回调接口,向回调服务器发起回调请求。
  4. 回调服务器得到上传对象完成的通知,完成数据更新,处理回调请求。
  5. 回调服务器将回调响应数据返回给OBS。
  6. OBS将上传对象请求的响应结果返回给客户端,响应结果中携带回调数据。

约束与限制

  • 目前只在POST上传对象、PUT上传对象以及合并段API中支持回调功能。
  • 在对象上传成功之后才会回调特定服务器,如果对象上传失败则不会回调。
  • 如果上传的图片大小超过25M,则无法通过imageInfo相关系统变量获取图片基本信息,会导致回调失败。

使用方式

OBS支持通过API、SDK方式使用上传回调,不支持通过管理控制台、OBS Browser+、obsutil方式使用上传回调。

回调签名验证

如果您在上传对象请求中设置回调参数,OBS在对象上传成功之后,将上传结果回调特定服务器,并将回调结果返回给您。回调结果中包含签名信息,以下介绍如何校验回调结果中的签名信息。

OBS回调您的服务器时,会在请求头中携带“Authorization”和 “x-signature-time”。您可以使用自己的SK重新计算签名,与请求头中的签名比对,验证请求确实来自OBS。

验证签名主要分为以下四步:

  1. 从回调请求头取出“x-signature-time”的值。
  2. 拼接待签名字符串:回调URL路径 + 换行 + 回调body体替换后的内容 + 换行 + x-signature-time
    回调URL路径
    回调body体替换后的内容
    x-signature-time

    回调body体中的变量在回调时会被替换为实际值,替换规则如表1

    表1 回调body体中的变量替换规则

    变量

    替换为

    示例

    bucket

    桶名称。

    my-bucket

    key

    对象名原始值。

    test.txt

    fsize

    对象大小,单位:字节。

    100

    etag

    对象的ETag。

    -

    fname

    对象名。该参数的替换值与回调body体类型有关:

    • 回调body体类型为“application/x-www-form-urlencoded” :替换为对象名的 Base64 编码。

      例如:“test.txt”替换为“dGVzdC50eHQ=”,“中文文件.txt”替换为“5Lit5paH5a+56LGhLnR4dA==”。

    • 回调body体类型为“application/json” :替换为对象名原始值。

      例如:“中文文件.txt”替换为“中文文件.txt”。

    dGVzdC50eHQ=

  3. 使用SK对待签名字符串做HMAC-SHA256,再做Base64编码。
  4. 比对计算结果与“Authorization”中“OBS <AK>:”后面的签名,如果一致则验证通过。

以下通过示例来介绍如何校验回调结果中的签名信息:

表2 示例的场景对比

对比项

示例一

示例二

示例三

上传方式

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”请求头。

相关文档