php 阿里云oss 上传回调
发布日期:2025-05-03 02:46:24 浏览次数:12 分类:精选文章

本文共 3214 字,大约阅读时间需要 10 分钟。

上传回调错误及排除

摘要

总结了SDK/API上传回调的示例、回调服务器的实现示例,说明了上传回调的调试方法,列举了上传回调的常见问题及排除方法。


关于上传回调

OSS在文件上传完成时,可以提供给用户的回调服务器(Callback Server)。在上传请求中携带相应的回调参数,即能实现上传回调。支持上传回调的API接口有:POST /{Bucket}/objects/{ObjectName}。


应用场景

  • 通知:上传回调的一种典型应用是,授权的第三方上传并回调。第三方上传文件时指定回调参数。上传完成后,OSS向回调服务器发送回调请求。回调服务器收到回调请后,记录上传信息;
  • 处理、审查、统计等:回调服务器收到回调请后,对上传的文件做处理、审查、统计等。

  • 数据流

    OSS上传回调流程如下图所示:

    -----------1------------> -----------2------------> 客户端(SDK/PostObject)               OSS                         回调服务器(Callback Server)             <----------4------------>             <----------3------------

    数据流含义

    数据流 含义 说明
    1 上传文件并携带回调参数 通过SDK(例如PostObject)完成
    2 OSS存储文件后发起回调 OSS向指定的CallbackUrl发起POST请求,回调超时时间为5秒
    3 回调服务器返回处理结果 回调服务器返回的消息体必须为JSON格式;OSS认为非200请求为回调失败
    4 OSS返回上传、回调结果 上传成功、回调失败返回203,ErrorCode为CallbackFailed,ErrorMessage描述错误原因

    SDK/PostObject

    上传回调参数

    字段 含义 说明
    callbackUrl 回调服务器地址 必选参数
    callbackHost 回调请求消息头中的Host值 可选参数,默认为callbackUrl
    callbackBody 回调请求的消息体 必选参数,内容可以包括系统变量和自定义变量
    callbackBodyType 回调请求消息头中的Content-Type值 可选参数,支持application/x-www-form-urlencoded和application/json,默认为前者

    上传回调参数的携带方式

  • 通过消息头中的x-oss-callback,携带回调参数:这种方式比较常用,推荐该方式;
  • 通过QueryString的callback,携带回调参数

  • 系统变量及自定义变量

    系统变量

    变量 含义 说明
    ${bucket} 存储空间名称 存储空间名称
    ${object} 文件名称 文件名称
    ${etag} 文件的ETag 文件的ETag
    ${size} 文件大小 文件大小
    ${mimeType} 文件类型 文件类型
    ${imageInfo.height} 图片高度 图片高度
    ${imageInfo.width} 图片宽度 图片宽度
    ${imageInfo.format} 图片格式 图片格式

    自定义变量

  • 通过消息头中的x-oss-callback-var,携带自定义变量:这种方式比较常用,也是推荐方式;
  • 通过QueryString的callback-var,携带自定义变量

  • 回调服务器

    回调服务器是一个HTTP服务器,处理OSS发送的回调请求,POST消息。回调服务器的URL即上传回调参数中的callbackUrl。回调服务器是用户自己实现的处理逻辑,实现上传数据的记录、审查、处理、统计等。


    回调签名

    为了确认收到的POST请求来自于OSS的上传回调,回调服务器需要验证该POST消息的签名。回调签名规则请参看相关文档。


    消息处理

    回调服务器的主要逻辑如下:

  • 回调服务器必须处理OSS的POST请求;
  • 回调服务器必须在5秒内完成处理并返回;
  • 回调服务器返回给OSS的消息体必须是JSON格式;
  • 回调服务器是用户自己的逻辑,OSS提供示例而不提供具体业务逻辑实现。

  • 实现示例

    回调服务器的实现示例如下:

    语言 示例 运行方法
    Java 解压后执行java -jar oss-callback-server-demo.jar 9000
    PHP Apache环境下部署运行
    Python 解压后执行python callback_app_server.py
    Ruby 执行ruby aliyun_oss_callback_server.rb
    Go 编译后执行aliyun_oss_callback_server
    C# 编译后执行aliyun-oss-net-callback-server.exe 127.0.0.1 80

    调试步骤

    调试客户端

    客户端调试时,可使用OSS提供的回调服务器地址,即回调参数中的callbackUrl。该回调服务器只验证回调请求的签名,对回调请求不做处理。对于签名验证成功的回调请求,返回{"Status":"OK"};签名验证失败的回调请求,返回400 Bad Request;非POST请求返回501 Unsupported method


    调试回调服务器

    回调服务器是一个支持处理POST请求的HTTP服务器,可以在OSS提供的示例基础上修改,也可以自己独立实现。OSS提供的回调服务器示例:

    语言 示例 运行方法
    Java 解压后执行java -jar oss-callback-server-demo.jar 9000
    PHP Apache环境下部署运行
    Python 解压后执行python callback_app_server.py
    Ruby 执行ruby aliyun_oss_callback_server.rb
    Go 编译后执行aliyun_oss_callback_server
    C# 编译后执行aliyun-oss-net-callback-server.exe 127.0.0.1 80

    常见错误及原因

    InvalidArgument

    原因:回调参数设置错误,或参数格式错误。常见的错误是ArgumentValue之间的回调参数,不是有效JSON格式。在JSON中,>"是转移字符,如"callbackBody":"{"bucket":${bucket),"object":${object}}"应该为"callbackBody":"{\"bucket\":${bucket},\"object\":${object}}"。针对具体的SDK,请参看对应的上传回调示例,详细请参考SDK使用示例部分。

    CallbackFailed

    原因

  • 回调服务器返回给OSS的消息体非JSON格式。您可以通过curl -d "<Content>" <CallbackServerURL> -v或抓包确认内容。Windows下推荐使用工具Wireshark抓包,Linux下使用命令tcpdump抓包。
  • 回调服务器处理时间超过5秒,OSS认为超时。建议回调服务器的处理逻辑修改为异步,保证在5秒内处理完毕并返回结果OSS。
  • 回调服务器返回给OSS的消息的状态码是400,请检查回调服务器的处理逻辑。
  • 回调服务器未启动,或者上传回调参数中的CallbackUrl,或者OSS与回调服务器的网络不通。推荐在ECS上部署回调服务器,与OSS同属内网可以节省流量费用,同时保证网络质量。

  • 总结

    本文详细介绍了OSS上传回调的实现方式,包括回调服务器的配置、数据流、SDK使用示例、调试步骤以及常见错误及排除方法。通过合理配置和调试,确保上传回调在实际应用中稳定、高效地运行。

    上一篇:PHP 面向对象 final类与final方法
    下一篇:php 返回html字符串长度限制,记一次js中和php中的字符串长度计算截取的终极问题和完美...

    发表评论

    最新留言

    不错!
    [***.144.177.141]2026年06月11日 20时59分21秒