Ali OSS服务端签名直传并设置上传回调

摘要:
服务端签名直传并设置上传回调背景请参考Web端直传实践里的背景介绍。为此OSS开发了上传回调功能。用户直接向OSS发送文件上传请求。OSS将应用服务器返回的内容返回给用户。简单讲,就是用户要上载一个文件到OSS服务器,而且希望上载完毕的时候自己的应用服务能够知道这件事,这时就需要设置一个回调函数,把这件事告知用户的应用服务器。

服务端签名直传并设置上传回调

背景

请参考Web端直传实践里的背景介绍。

当采用服务端签名后直传方案后,问题来了,用户上传数据后,很多场景下,应用服务器都要知道用户上传了哪些文件,文件名字,甚至如果是图片的话,图片的大小等。为此OSS开发了上传回调功能。

用户的请求逻辑

  1. 用户向应用服务器取到上传policy和回调设置。
  2. 应用服务器返回上传policy和回调。
  3. 用户直接向OSS发送文件上传请求。
  4. 等文件数据上传完,OSS给用户Response前,OSS会根据用户的回调设置,请求用户的服务器。
  5. 如果应用服务器返回成功,那么就返回用户成功,如果应用服务器返回失败,那么OSS也返回给用户失败。这样确保了用户上传成功的照片,应用服务器都已经收到通知了。
  6. 应用服务器给OSS返回。
  7. OSS将应用服务器返回的内容返回给用户。
    Ali OSS服务端签名直传并设置上传回调第1张

简单讲,就是用户要上载一个文件到OSS服务器,而且希望上载完毕的时候自己的应用服务能够知道这件事,这时就需要设置一个回调函数,把这件事告知用户的应用服务器。这样当OSS收到用户的上传请求之后,开始上传,传完之后不会直接给用户返回结果,而是先通知用户的应用服务器:“我上传完毕了”,然后应用服务器告诉OSS:“我知道啦,你帮我转达给我的主人吧”,于是OSS就把结果转达给用户了。

示例

用户电脑浏览器测试样例:点击这里体验上传回调示例

用手机测试该上传是否有效。可以用手机(微信、QQ、手机浏览器等)扫一扫二维码试试(这个不是广告,只是上述网址的二维码,为了让大家看一下这个实现能在手机端完美运行)。
Ali OSS服务端签名直传并设置上传回调第2张

代码下载

点击这里:oss-h5-upload-js-php-callback.zip

例子是采用后端签名,语言是用PHP。

其他语言的用法:

  1. 下载对应的语言示例。
  2. 然后修改示例代码,如设置监听的端口等,然后运行。
  3. oss-h5-upload-js-php-callback.zip里面的upload.js, 将里面的变量severUrl改成第2步部署的地址。如severUrl =http://1.2.3.4:8080或者serverUrl=http://abc.com/post/

快速使用

只要以下三步,就能实现文件快速通过网页上传到OSS,并且OSS会回调通知到用户设置的应用服务器。

  1. 设置成自己的 id、key、bucket。
    设置方法:修改php/get.php,将变量$id设成AccessKeyId,$key设置成AccessKeySecret,$host设置成 bucket+endpoint。
    1. $id='xxxxxx';
    2. $key='xxxxx';
    3. $host ='http://post-test.oss-cn-hangzhou.aliyuncs.com
  2. 为了浏览安全,必须为bucket设置Cors, 参照下文。

  3. 设置自己的回调URL,如http://abc.com/test.html(必须公网访问得通),即自己的回调服务器地址,OSS会在文件上传完成后,把文件上传信息,通过自己设置的回调URL(http://abc.com/test.html)发送给应用服务器。
    设置方法:修改php/get.php,(这个回调服务端代码实例参考下文)

  1. $callbackUrl ="http://abc.com/test.html";

这个例子里面更多细节 ,如上传签名,设置随机文件名等更多细节可以参照:点击这里,了解上传更多细节

下面讲解一下核心逻辑。

核心代码解析

代码要添加的内容如下:

  1. new_multipart_params ={
  2. 'key':key +'${filename}',
  3. 'policy':policyBase64,
  4. 'OSSAccessKeyId':accessid,
  5. 'success_action_status':'200',//让服务端返回200,不然,默认会返回204
  6. 'callback':callbackbody,
  7. 'signature':signature,
  8. };

上述的callbackbody 是php服务端返回的。在本例中,从后端php取到的内容如下:

  1. {"accessid":"6MKOqxGiGU4AUk44",
  2. "host":"http://post-test.oss-cn-hangzhou.aliyuncs.com",
  3. "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1MjoyOVoiLCJjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
  4. "signature":"VsxOcOudxDbtNSvz93CLaXPz+4s=",
  5. "expire":1446727949,
  6. "callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==","dir":"user-dirs/"}

上面提到callbackbody,就是上述返回结果里面的callback内容,经过base64编码后生成的。

解码后的内容如下:

  1. {"callbackUrl":"http://oss-demo.aliyuncs.com:23450",
  2. "callbackHost":"oss-demo.aliyuncs.com",
  3. "callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
  4. "callbackBodyType":"application/x-www-form-urlencoded"}

内容的解析如下:

  • CallbackUrl: OSS往这个机器发送的url请求。
  • callbackHost: OSS发送这个请求时,请求头部所带的Host头。
  • callbackBody: OSS请求时,发送给应用服务器的内容,可以包括文件的名字、大小、类型,如果是图片可以是图片的高度、宽度。
  • callbackBodyType: 请求发送的Content-Type。

回调应用服务器

在用户的请求逻辑中,很重要的地方就是第4步和第5步,OSS与应用服务器交互的时候,用户可能会有以下疑问:

  • 问题1:如果我是开发者,那么我要怎么样确认请求是从OSS发送过来的呢?

    答案:OSS发送请求时,会跟应用服务器构造签名。两者通过签名保证。

  • 问题2:这个签名是怎么做的?或者有示例代码吗?

    答案:有的。上面的例子里面是Callback应用服务器的例子:http://oss-demo.aliyuncs.com:23450(目前只支持Linux)。
    上面运行的代码是:callback_app_server.py.zip
    运行方案:在Linux下面直接执行里面的文件python callback_app_server.py即可,程序自实现了一个简单的http server,运行该程序可能需要安装rsa的依赖。

  • 问题3: 为何我的应用服务器收到的回调请求没有Authotization头?

    答案:有些 Web server会将Authorization头自行解析掉,比如apache2,因此需要设置成不解析这个头部。以apache2为例,具体设置方法为:

    1. 打开rewrite模块,执行命令:a2enmod rewrite;
    2. 修改配置文件/etc/apache2/apache2.conf(apache2的安装路径不同会有不一样)。将Allow Override设置成All,然后添加下面两条配置:
      RewriteEngine on
      RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

示例程序只是完成了如何检查应用服务器收到的签名, 用户要自行增加对应用服务器收到回调的内容的格式解析 。

其他语言的回调应用服务器版本

Java版本:

  • 下载地址:点击这里
  • 运行方法:解压包运行java -jar oss-callback-server-demo.jar 9000(9000就运行的端口,可以自己指定)

    注意这个jar例子在java 1.7运行通过,如果有问题可以自己依据提供的代码进行修改。这是一个maven项目。

PHP版本:

  • 下载地址:点击这里
  • 运行方法:部署到Apache环境下,因为PHP本身语言的特点,取一些数据头部会依赖于环境。所以可以参考例子根据自己所在环境进行修改。

Python版本:

  • 下载地址:点击这里
  • 运行方法:解压包直接运行python callback_app_server.py即可,程序自实现了一个简单的http server,运行该程序可能需要安装rsa的依赖。

Ruby版本:

  • 下载地址:点击这里
  • 运行方法: ruby aliyun_oss_callback_server.rb

总结

https://help.aliyun.com/document_detail/31927.html

授权给第三方上传

适用场景

在典型的C/S系统架构中,服务器端负责接收并处理客户端的请求。那么考虑一个使用OSS作为后端的存储服务,客户端将要上传的文件发送给服务器端,然后服务器端再将数据转发上传到OSS。在这个过程中,一份数据需要在网络上传输两次,一次从客户端到服务器端,一次从服务器端到OSS。当访问量很大的时候,服务器端需要有足够的带宽资源来满足多个客户端的同时上传的需求,这对架构的伸缩性提出了挑战。

为了解决这种场景带来的挑战,OSS提供了授权给第三方上传的功能。使用这个功能,每个客户端可以直接将文件上传到OSS而不是通过服务器端转发,节省了自建服务器的成本,并且充分利用了OSS的海量数据处理能力,无需考虑带宽和并发限制等,可以让客户专心于业务处理。

目前授权上传可以由两种实现方式:

URL签名

URL签名是授权访问的一种方式,即在请求的URL中带OSS AccessKeyId和Signature字段,这样用户就可以直接使用该URL来进行上传。每个URL签名中携带有过期时间以保证安全。具体的做法可以参考在URL中包含签名

临时访问凭证

临时访问凭证是通过阿里云Security Token Service(STS)来实现授权的一种方式。其实现请参见STS Java SDK。临时访问凭证的流程如下:

  1. 客户端向服务器端发起获得授权的请求。服务器端先验证客户端的合法性。如果是合法客户端,那么服务器端会使用自己的AccessKey来向STS发起一个请求授权的请求,具体可以参考访问控制
  2. 服务器端获取临时凭证之后返回给客户端。
  3. 客户端使用获取的临时凭证来发起向OSS的上传请求,更详细的请求构造可以参考临时授权访问。客户端可以缓存该凭证用来上传,直到凭证失效再向服务器端请求新的凭证。

https://help.aliyun.com/document_detail/31852.html?spm=5176.doc50092.6.593.oLFTdy

关于上传回调

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

更详细的介绍请参看开发人员指南API

提示:回调服务器(Callback Server),有时也叫业务服务器。

应用场景

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

数据流

OSS上传回调流程,如下图:

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

上图中的数据流含义,见下表:

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

注:

  • [1] 格式请参看SDK/PostObject
  • [2] 回调请求POST的格式详见发起回调请求
  • [3] 超时时间为固定值,不支持配置;
  • [4] 参数无效、认真失败返回40x,超时、无法连接返回50x

SDK/PostObject

上传时可以通过设置回调参数,指定回调服务器URL、发送给回调服务器的数据、格式等。回调服务器处理回调时,需要一些上下文信息,如bucketobject等,通过系统变量指定;系统变量以外的上下文信息,通过自定义变量指定。

上传回调参数

上传回调包括以下参数:

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

上传回调参数通过上传请求携带,有两种方式:

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

x-oss-callbackcallback的值生成规则如下:

  1. Callback:=Base64(CallbackJson)
  2. CallbackJson:='{'CallbackUrlItem,CallbackBodyItem[,CallbackHostItem,CallbackBodyTypeItem]'}'
  3. CallbackUrlItem:='"'callbackUrl'"'':''"'CallbackUrlValue'"'
  4. CallbackBodyItem:='"'callbackBody'"'':''"'CallbackBodyValue'"'
  5. CallbackHostItem:='"'callbackHost'"'':''"'CallbackHostValue'"'
  6. CallbackBodyTypeItem:='"'callbackBodyType'"':'"'CallbackBodyType'"'
  7. CallbackBodyType:=application/x-www-form-urlencoded |application/json

CallbackJson的值示例如下:

  1. {
  2. "callbackUrl":"http://abc.com/test.php",
  3. "callbackHost":"oss-cn-hangzhou.aliyuncs.com",
  4. "callbackBody":"{"bucket":${mimeType}, "object":${object},"size":${size},"mimeType":${mimeType},"my_var":${x:my_var}}",
  5. "callbackBodyType":"application/json"
  6. }

  1. {
  2. "callbackUrl":"http://abc.com/test.php",
  3. "callbackBody":"bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&my_var=${x:my_var}"
  4. }
         /*callback: new Buffer(JSON.stringify({
            'callbackUrl':'http://abc.com/test.php', 
            'callbackBody':'bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}'})).toString('base64'),*/
        JSONObject call = newJSONObject();
        call.put("callbackUrl", "http://abc.com/test.php");
        call.put("callbackBody", "bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}");
        byte[] bytes =Base64.encodeBase64(call.toString().getBytes());
        String callback = new String(bytes);

系统变量及自定义变量

CallbackJson示例中的callbackBody包括如${bucket}${object}${size}的变量,即为OSS定义的系统变量,OSS回调时会用实际值替换掉系统变量。OSS定义的系统变量如下表:

变量含义
${bucket}存储空间名称
${object}文件名称
${etag}文件的ETag
${size}文件大小
${mimeType}文件类型,如image/jpeg等
${imageInfo.height}图片高度
${imageInfo.width}图片宽度
${imageInfo.format}图片格式,如jpg、png等

注意:

  • 系统变量大小写敏感;
  • 系统的变量的格式一定是${bucket}
  • imageInfo针对于图片格式,为非图片格式值为空。

CallbackJson示例中的callbackBody包括如${x:my_var}的变量,即自定义变量,OSS回调时会用自定义的值替换掉自定义变量。自定义变量的值可以在上传请求中定义并携带,有以下两种方式:

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

x-oss-callback-varcallback-var的生成规则如下:

  1. CallbackVar:=Base64(CallbackVarJson)
  2. CallbackVarJson:='{'CallbackVarItem[,CallbackVarItem]*'}'
  3. CallbackVarItem:='"''x:'VarName'"':'"'VarValue'"'

CallbackVarJson的值示例如下:

  1. {
  2. "x:my_var1":"value1",
  3. "x:my_var2":"value2"
  4. }

注意:

  • 自定义变量必须以x:开头,大小写敏感,格式是${x:my_var}
  • 自定义变量的长度受消息头、URL的长度限制,建议自定义变量不超过10个,总长度不超过512Byte。

SDK使用示例

部分SDK对上述步骤进行了封装,如Java、JS;部分SDK需要使用上面的规则生成上传回调参数和自定义变量,如Python、PHP、C。SDK的使用示例如下:

SDK上传回调示例说明
JavaCallbackSample.java注意CallbackBody中的转义字符
Pythonobject_callback.py
PHPCallback.php注意上传的$options中OSS_CALLBACKOSS_CALLBACK_VAR不需要base64,SDK会做
JSobject.test.js
Coss_callback_sample.c
Rubycallback.rb
iOS上传后回调通知注意<var1>的格式应该是x:var1
Andriod上传后回调通知注意CallbackBody中的转义字符

注意:C# SDK、Go SDK尚不支持上传回调。

PostObject使用示例

PostObject支持上传回调,回调参数通过表单域callback携带,自定义变量通过独立的表单域携带,详细请参看PostObjet。PostObject的使用示例如下:

SDK上传回调示例
JavaPostObjectSample.java
Pythonobject_post.py
JSJavaScript客户端签名直传
C#PostPolicySample.cs

回调服务器

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

回调签名

回调服务器为了确认收到的POST请求,来自于OSS的上传回调,需要验证该POST消息的签名。当然,回调服务器也可以不验证签名,直接处理该消息。为了提高回调服务器的安全性,建议验证消息签名。回调签名规则请参看回调签名

提示:OSS的回调服务器示例中提供了签名校验的实现,推荐直接使用该部分代码。

消息处理

回调服务器的主要逻辑,对OSS的回调请求进行处理。以下几点请注意:

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

实现示例

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

语言示例运行方法
JavaAppCallbackServer.zip解压后执行java -jar oss-callback-server-demo.jar 9000
PHPcallback-php-demo.zipApache环境下部署运行
Pythoncallback_app_server.py.zip解压后执行python callback_app_server.py
Rubyoss-callback-server执行ruby aliyun_oss_callback_server.rb

调试步骤

上传回调的调试分为两部分,上传的客户端、处理回调的回调服务器。建议先调试客户端上传部分,再调试回调服务器部分。两部分单独调试完成后,再运行完整的上传回调。

调试客户端

客户端调试时,可使用OSS提供的回调服务器http://callback.oss-demo.com:23450,即回调参数callbackUrl。该回调服务器只验证回调请求的签名,对回调请求不做处理。对于签名验证成功的回调请求,返回{"Status":"OK"};签名验证失败的回调请求,返回400 Bad Request;非POST请求返回501 Unsupported method。示例回调服务器的代码请参看callback_app_server.py.zip

调试回调服务器

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

语言示例运行方法
JavaAppCallbackServer.zip解压后执行java -jar oss-callback-server-demo.jar 9000
PHPcallback-php-demo.zipApache环境下部署运行
Pythoncallback_app_server.py.zip解压后执行python callback_app_server.py
Rubyoss-callback-server执行ruby aliyun_oss_callback_server.rb

回调服务器可以通过cRUL命令调试,下面几个命令可能会用到:

  1. # 向回调服务器发送消息体为 `object=test_obj` 的 `POST` 请求,可以使用如下命令
  2. curl -d "object=test_obj"http://callback.oss-demo.com:23450 -v
  3. # 向回调服务器发送消息体为文件 `post.txt` 内容 的 `POST` 请求,可以使用如下命令
  4. curl -d @post.txt http://callback.oss-demo.com:23450 -v
  5. #向回调服务器发送消息体为文件 `post.txt` 内容的 `POST` 请求,并携带指定的消息头 `Content-Type`
  6. curl -d @post.txt -H "Content-Type: application/json"http://callback.oss-demo.com:23450 -v

注意:

  • 调试回调服务器时,可以先忽略签名验证部分,因为cURL模拟签名功能比较困难;
  • 签名验证功能OSS示例中已经提供,建议直接使用;
  • 回调服务器建议有日志功能,记录收到的所有消息,方便调试、跟踪;
  • 回调服务器正确处理回调请求后,一定要返回200,而不是其它的20x
  • 回调服务器返回给OSS的消息体,一定要是JSON格式,Content-Type设置为application/json

常见错误及原因

InvalidArgument

  1. <Error>
  2. <Code>InvalidArgument</Code>
  3. <Message>The callback configuration is not json format.</Message>
  4. <RequestId>587C79A3DD373E2676F73ECE</RequestId>
  5. <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId>
  6. <ArgumentName>callback</ArgumentName>
  7. <ArgumentValue>{"callbackUrl":"8.8.8.8:9090","callbackBody":"{"bucket":${bucket},"object":${object}}","callbackBodyType":"application/json"}</ArgumentValue>
  8. </Error>

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

转义后的字符转义前的字符
\\\
\”
\b
f\f
\n
\r
\t

CallbackFailed

  1. <Error>
  2. <Code>CallbackFailed</Code>
  3. <Message>Response body is not valid json format.</Message>
  4. <RequestId>587C81A125F797621829923D</RequestId>
  5. <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId>
  6. </Error>

原因:回调服务器返回给OSS的消息体非JSON格式。您可以通过curl -d "<Content>" <CallbackServerURL> -v或抓包确认内容。Windows下推荐使用工具Wireshark抓包,Linux下使用命令tcpdump抓包。一些非法返回消息体如下:OK357273277{"Status":"OK"}(即含有ef bb bf三个字节的BOM头)等

  1. <Error>
  2. <Code>CallbackFailed</Code>
  3. <Message>Error status : -1.OSS can not connect to your callbackUrl, please check it.</Message>
  4. <RequestId>587C8735355BE8694A8E9100</RequestId>
  5. <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId>
  6. </Error>

原因:回调服务器处理时间超过5秒,OSS认为超时。建议回调服务器的处理逻辑修改为异步,保证在5秒内处理完毕并返回结果OSS。

  1. <Error>
  2. <Code>CallbackFailed</Code>
  3. <Message>Error status : -1 8.8.8.8:9090 reply timeout, cost:5000ms, timeout:5000ms (err -4, errno115)</Message>
  4. <RequestId>587C8D382AE0B92FA3EEF62C</RequestId>
  5. <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId>
  6. </Error>

原因:回调服务器处理时间超过5秒,OSS认为超时。

  1. <Error>
  2. <Code>CallbackFailed</Code>
  3. <Message>Error status : 400.</Message>
  4. <RequestId>587C89A02AE0B92FA3C7981D</RequestId>
  5. <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId>
  6. </Error>

原因:回调服务器返回给OSS的消息的状态码是400,请检查回调服务器的处理逻辑。

  1. <Error>
  2. <Code>CallbackFailed</Code>
  3. <Message>Error status : 502.</Message>
  4. <RequestId>587C8D382AE0B92FA3EEF62C</RequestId>
  5. <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId>
  6. </Error>

原因:回调服务器未启动,或者上传回调参数中的CallbackUrl,或者OSS与回调服务器的网络不通。推荐在ECS上部署回调服务器,与OSS同属内网可以节省流量费用,同时保证网络质量。

常用链接

https://help.aliyun.com/document_detail/50092.html?spm=5176.doc27781.6.1050.pxQLlA

免责声明:文章转载自《Ali OSS服务端签名直传并设置上传回调》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ansible用playbook实现定期监控各机器磁盘和进程状态windows+django3.1+ASGI+nginx部署下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

react hook+antd实现点击发送验证码功能

要实现的效果如图,点击发送验证码,文字变为60秒后重新发送,并且开始倒计时 这是写成一个组件格式component -> eidtPass.tsx import React, { useState } from 'react'import { Modal, Form, Input, notification } from 'antd'import...

Kafka 权限管理实战(最全整理)

一、概述 1、Kafka的权限分类 1)、身份认证(Authentication):对client 与服务器的连接进行身份认证,brokers和zookeeper之间的连接进行Authentication(producer 和 consumer)、其他 brokers、tools与 brokers 之间连接的认证。 2)、权限控制(Authorizatio...

从C#中传递object到lua的一个问题

本来我是想从C#中把form对象传递到Lua里面去,然后在Lua中调用form下面的各个组件,比如textbox、button等,从而实现在Lua中控制C#中form界面的布局。 但是发现如下问题: 1 //Form1.cs 2 3 class Form1 4 { 5 private System.Windows.Forms.TextBox tex...

Windows平台将远程服务器的目录挂载为本地磁盘

我们在设置数据库自动备份时,为了数据的安全往往需要直接将数据备份到远程服务器上。在Linux可以通过NFS挂载来实现,在Windows平台可以直接通过net use+subst来实现将远程服务器的目录挂载为本地磁盘进行读写操作。机器A:172.168.6.132 备份服务器。机器B:172.168.6.133 数据库服务器。在机器B上执行如下两步操作:1....

ES6 对象的扩展

一、属性的简洁表示法 ES6 允许直接写入变量和函数,作为对象的属性和方法 let a=1; let b=2; let es5={a:a,b:b}; // 等同于 let es6={a,b}; 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值 同样的,如果对象是方法,也可以简写: let es5={...

WPF开发进阶

前一篇 简单的介绍了Fody/PropertyChanged的使用方法, 这一篇,我们详细介绍它的一些比较重要的特性和规则 1. Attributes 通过在类或属性上标记这些特性,可以在编译代码时,注入特定的功能 ImplementPropertyChangedAttribute 为类标记此特性,可以实现INotifyPropertyChanged接口...