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

背景

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

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

用户的请求逻辑

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

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

示例

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

用手机测试该上传是否有效。可以用手机(微信、QQ、手机浏览器等)扫一扫二维码试试(这个不是广告,只是上述网址的二维码,为了让大家看一下这个实现能在手机端完美运行)。

代码下载

点击这里: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 回调服务器(Callback Server)
  3. <----------4---------- <----------3----------

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

数据流 含义 说明
1 上传文件并携带回调参数[1] 通过SDK(PutObjectCompleteMultipartUpload)/PostObject完成
2 OSS存储文件后发起回调 OSS向上传请求中指定的 CallbackUrl 发起 POST[2] 请求,回调超时时间是 5秒 [3]
3 回调服务器返回处理结果 回调服务器返回的消息体一定要是 Json 格式;OSS认为非 200 请求为回调失败[4]
4 OSS返回上传、回调结果 上传、回调都成功,返回 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-callback 或 callback 的值生成规则如下:

  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 = new JSONObject();
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-var 或 callback-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 上传回调示例 说明
Java CallbackSample.java 注意CallbackBody中的转义字符
Python object_callback.py  
PHP Callback.php 注意上传的$options中OSS_CALLBACKOSS_CALLBACK_VAR不需要base64,SDK会做
JS object.test.js  
C oss_callback_sample.c  
Ruby callback.rb  
iOS 上传后回调通知 注意<var1> 的格式应该是x:var1
Andriod 上传后回调通知 注意CallbackBody中的转义字符

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

PostObject使用示例

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

SDK 上传回调示例
Java PostObjectSample.java
Python object_post.py
JS JavaScript客户端签名直传
C# PostPolicySample.cs

回调服务器

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

回调签名

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

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

消息处理

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

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

实现示例

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

语言 示例 运行方法
Java AppCallbackServer.zip 解压后执行java -jar oss-callback-server-demo.jar 9000
PHP callback-php-demo.zip Apache环境下部署运行
Python callback_app_server.py.zip 解压后执行python callback_app_server.py
Ruby oss-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提供的回调服务器示例:

语言 示例 运行方法
Java AppCallbackServer.zip 解压后执行java -jar oss-callback-server-demo.jar 9000
PHP callback-php-demo.zip Apache环境下部署运行
Python callback_app_server.py.zip 解压后执行python callback_app_server.py
Ruby oss-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 \\b
\f \\f
\n \\n
\r \\r
\t \\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 抓包。一些非法返回消息体如下:OK\357\273\277{"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服务端签名直传并设置上传回调的更多相关文章

  1. 在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现Web端直传,服务端签名直传并设置上传回调的实现流程

    在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现本地文件上传流程 by shuijingwan · 2016/01/13 1.SDK安装 github ...

  2. Ali OSS 服务端签名并设置回调,客户端上传文件

    一.最近做阿里云oss文件上传开发,一点收获分享给大家,帮助大家绕过一些坑.关于阿里云oss服务的介绍,我这里不做赘述了,可以查看阿里云OSS开发api文档. 在这里我主要介绍下,文件上传流程比较复杂 ...

  3. 阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)

    分片上传(结合element-ui的upload组件实现自定义上传) async uploadFree(content){ let data = await this.getOssToken(); / ...

  4. MVC文件上传06-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义控制器上传多个文件

    当需要在控制器中处理除了文件的其他表单字段,执行控制器独有的业务逻辑......等等,这时候我们可以自定义控制器. MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证 ...

  5. 搭建基于.NetFrameWork的私有nuget服务端及打包项目发布上传

    一.私有Nuget服务端搭建 1.创建一个.NetFramework web项目 2.在nuget管理中 安装 nuget.server包 3.安装完成后修改web.config里面的 apikey ...

  6. C#开发BIMFACE系列8 服务端API之获取文件上传状态信息

    系列目录     [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...

  7. 使用阿里云OSS的服务端签名后直传功能

    网站一般都会有上传功能,而对象存储服务oss是一个很好的选择.可以快速的搭建起自己的上传文件功能. 该文章以使用阿里云的OSS功能为例,记录如何在客户端使用阿里云的对象存储服务. 服务端签名后直传 背 ...

  8. Vue上传通过“服务端签名后直传”上传文件到阿里云 报错 400 Bad Request

    我报错的原因是 formData.append('file', file) 放在签名前面了 解决办法 formData.append('file', file) 一定在最后 /** * 上传文件到 o ...

  9. 支付宝ios支付请求Java服务端签名报的一个错(ALI40247) 原创

    今天做app的支付宝支付,遇到些问题,以前做支付宝支付签名都是直接在客户端App进行,今天下了最新版本ios的支付宝支付demo,运行demo时底部有红色的显眼字体,告知用户签名必须在服务端进行... ...

随机推荐

  1. linux下显示不规则图片窗口

    测试环境是ubuntu15.04,使用的图形库是gtk+. 图片格式采用的是X11的xpm格式,首先从网上找一个背景透明的png图片,然后用图形转换工具(比如gimp)转换为xpm格式. 程序代码如下 ...

  2. Android开发技巧——自定义控件之组合控件

    Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...

  3. myBatis源码学习之SqlSession

    在上一篇文章中SqlSessionFactory介绍了生产SqlSession的工厂,SqlSession是一个接口其具体实现类为DefaultSqlSession,SqlSession接口主要定义了 ...

  4. Android ViewPager和Slidingmenu手势冲突问题

    尊重原创:  http://blog.csdn.net/sk719887916/article/details/40043961 skay 想必大家都遇到过手势和焦点的问题   对于安卓初学者或者初次 ...

  5. hover变化图片

    <div class="icon width mar"> <div class="cpzs_tit"></div> < ...

  6. 前端iFrame跨域问题

    一.父域访问子域的元素 项目需求: iFrame是个聊天窗口,要求聊天窗口中点击图片图标,在父域将内容展示出来. 解决方法:(jQuery) 首先/要等iFrame加载完再执行函数!(代码如下) va ...

  7. C4 垃圾回收

    使用C4垃圾回收器可以有效提升对低延迟有要求的企业级Java应用程序的伸缩性. 到目前为止,stop-the-world式的垃圾回收视为影响Java应用程序伸缩性的一大障碍,而伸缩性又是现代企业级Ja ...

  8. Java学习不走弯路教程(7.Eclipse环境搭建)

    7.Eclipse环境搭建 在前几章,我们熟悉了DOS环境下编译和运行Java程序,对于大规模的程序编写,开发工具是必不可少的.Java的开发工具比较常用的是Eclipse.在接下来的教程中,我们将基 ...

  9. win10 下安装mysql服务器社区版本mysql-5.7.22-winx64

    下载 下载: http://dev.mysql.com/downloads/mysql/ 解压到C盘 添加环境变量path 添加环境变量 右击我的电脑->属性->高级系统设置->高级 ...

  10. 前端CDN公共库整理

    转自: 灰狼博客, 地址: http://itlobo.com/articles/2016.html 现在web应用都在使用js类库,这些类库小的几十K,大的几百K,而国内网络访问速度大家都知道不是那 ...