943
阿里云
服务端签名直传并设置上传回调__Web端直传实践_最佳实践_对象存储 OSS-阿里云
背景
请参考 Web端直传实践 里的背景介绍。
当采用服务端签名后直传方案后,问题来了,用户上传数据后,很多场景下,应用服务器都要知道用户上传了哪些文件,文件名字,甚至如果是图片的话,图片的大小等。为此OSS开发了上传回调功能。
用户的请求逻辑
- 用户向应用服务器取到上传policy和回调设置。
- 应用服务器返回上传policy和回调。
- 用户直接向OSS发送文件上传请求。
- 等文件数据上传完,OSS给用户Response前,OSS会根据用户的回调设置,请求用户的服务器。
- 如果应用服务器返回成功,那么就返回用户成功,如果应用服务器返回失败,那么OSS也返回给用户失败。这样确保了用户上传成功的照片,应用服务器都已经收到通知了。
- 应用服务器给OSS返回。
- OSS将应用服务器返回的内容返回给用户。
简单讲,就是用户要上载一个文件到OSS服务器,而且希望上载完毕的时候自己的应用服务能够知道这件事,这时就需要设置一个回调函数,把这件事告知用户的应用服务器。这样当OSS收到用户的上传请求之后,开始上传,传完之后不会直接给用户返回结果,而是先通知用户的应用服务器:“我上传完毕了”,然后应用服务器告诉OSS:“我知道啦,你帮我转达给我的主人吧”,于是OSS就把结果转达给用户了。
示例
用户电脑浏览器测试样例:点击这里体验上传回调示例
用手机测试该上传是否有效。可以用手机(微信、QQ、手机浏览器等)扫一扫二维码试试(这个不是广告,只是上述网址的二维码,为了让大家看一下这个实现能在手机端完美运行)。
代码下载
点击这里:oss-h5-upload-js-php-callback.zip
例子是采用后端签名,语言是用PHP。
其他语言的用法:
- 下载对应的语言示例。
- 然后修改示例代码,如设置监听的端口等,然后运行。
- 在
oss-h5-upload-js-php-callback.zip
里面的upload.js, 将里面的变量severUrl改成第2步部署的地址。如severUrl =http:/1.2.3.4:8080
或者serverUrl=https://abc.com/post/
快速使用
只要以下三步,就能实现文件快速通过网页上传到OSS,并且OSS会回调通知到用户设置的应用服务器。
- 设置成自己的 id、key、bucket。
设置方法:修改php/get.php
,将变量$id设成AccessKeyId,$key设置成AccessKeySecret,$host设置成 bucket+endpoint。$id= 'xxxxxx';
$key= 'xxxxx';
$host = 'https://post-test.oss-cn-hangzhou.aliyuncs.com
为了浏览安全,必须为bucket设置Cors, 参照下文。
设置自己的回调URL,如
https://abc.com/test.html
(必须公网访问得通),即自己的回调服务器地址,OSS会在文件上传完成后,把文件上传信息,通过自己设置的回调URL(https://abc.com/test.html
)发送给应用服务器。
设置方法:修改php/get.php,(这个回调服务端代码实例参考下文)
$callbackUrl = "https://abc.com/test.html";
这个例子里面更多细节 ,如上传签名,设置随机文件名等更多细节可以参照:点击这里,了解上传更多细节。
下面讲解一下核心逻辑。
核心代码解析
代码要添加的内容如下:
new_multipart_params = {
'key' : key + '${filename}',
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
'callback': callbackbody,
'signature': signature,
};
上述的callbackbody 是php服务端返回的。在本例中,从后端php取到的内容如下:
{"accessid":"6MKOqxGiGU4AUk44",
"host":"https://post-test.oss-cn-hangzhou.aliyuncs.com",
"policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1MjoyOVoiLCJjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
"signature":"VsxOcOudxDbtNSvz93CLaXPz+4s=",
"expire":1446727949,
"callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==","dir":"user-dirs/"}
上面提到callbackbody,就是上述返回结果里面的callback内容,经过base64编码后生成的。
解码后的内容如下:
{"callbackUrl":"https://oss-demo.aliyuncs.com:23450",
"callbackHost":"oss-demo.aliyuncs.com",
"callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
"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应用服务器的例子:
https://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为例,具体设置方法为:
- 打开rewrite模块,执行命令:a2enmod rewrite;
- 修改配置文件
/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
总结
- 第一个例子:讲解如何在JavaScript直接签名,直接表单上传到OSS。 oss-h5-upload-js-direct.tar.gz
- 第二个例子:讲解如何在从后端PHP获取签名,然后直接表单上传到OSS。 oss-h5-upload-js-php.tar.gz
- 第三个例子:讲解如何在从后端PHP获取签名及上传后回调。然后直接表单上传到OSS,OSS回调完应用服务器再返回给用户。 oss-h5-upload-js-php-callback.tar.gz
最后更新:2016-11-23 16:04:09
上一篇:
服务端签名后直传__Web端直传实践_最佳实践_对象存储 OSS-阿里云
下一篇:
CDN加速OSS__存储空间管理_最佳实践_对象存储 OSS-阿里云
阿里云 Python SDK 列表__用户指南_命令行工具 CLI-阿里云
表数据量统计__扩展工具_用户指南(RDBMS)_数据管理-阿里云
滑动验证插件__使用手册_数据风控-阿里云
CreateVirtualMFADevice__用户管理接口_RAM API文档_访问控制-阿里云
SnapshotType__数据类型_API 参考_云服务器 ECS-阿里云
删除存储空间__快速入门_对象存储 OSS-阿里云
标签列表__API列表_OpenAPI 1.0_移动推送-阿里云
采用MySQLdump工具迁移__数据管理工具(DMS)使用_产品使用问题_云数据库 RDS 版-阿里云
录制测试脚本__脚本开发_Lite用户使用手册_性能测试-阿里云
查询消费端连接__消费管理相关接口_Open API_消息队列 MQ-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云