服务器段使用php,是否有上传回调demo?
详细解答可以参考官方帮助文档
本文讲解如何搭建一个基于OSS的移动应用数据直传服务并设置上传回调。
背景
快速搭建移动应用直传服务介绍了如何快速搭建一个基于OSS的移动应用数据直传服务。但这一方案有个问题:对于Android/iOS移动应用来说,只需要申请一次STS凭证,就能多次使用该STS凭证上传数据到OSS。这就导致应用服务器无法得知用户上传了哪些数据 ,作为该app的开发者,就没法对应用上传数据进行管理。为此OSS提供了上传回调方案。
原理介绍
上传回调的原理如下图所示:
OSS在收到Android/iOS移动应用的数据(上图中步骤5)和在返回用户上传结果(上图中步骤6)之间,触发一个上传回调任务,即第上图中步骤5.5,先回调用户服务器,得到应用服务器返回的内容,然后将此内容返回给Android/iOS移动应用。详情请参见Callback API文档。
上传回调的作用
通过上传回调让用户应用服务器知道当前上传文件的基本信息。 返回的基本信息可以包含下表中一个或多个变量,返回内容的格式在Android/iOS上传时指定。
系统变量
含义
bucket
移动应用上传文件到OSS的哪个存储空间
object
移动应用上传文件到OSS后保存的文件名
etag
该上传的文件的ETag,即返回给用户的etag字段
size
上传文件的大小
mimeType
资源类型
imageInfo.height
图片高度
imageInfo.width
图片宽度
imageInfo.format
图片格式,如jpg、png等
通过上传回调设定自定义参数,达到信息传递的目的。 假如您是一个开发者,您想知道当前用户所使用的app版本、当前用户所在的操作系统版本、用户的GPS信息、用户的手机型号。您可以在Android/iOS端上传文件时,指定自定义参数,如下所示:
x:version:指定APP版本
x:system:指定操作系统版本
x:gps:指定GPS信息
x:phone:指定手机型号
Android/iOS移动应用上传文件到OSS时附带上述参数,然后OSS把这些参数放到CallbackBody里发给应用服务器。这样应用服务器就能收到这些信息,达到信息传递的目的。
上传回调对应用服务器的要求
您必须部署一个可以接收POST请求的服务,这个服务必须有公网地址,如www.abc.com/callback.php,或者外网IP地址。
您必须给OSS正确的返回,返回格式必须是JSON格式,内容自定义。OSS会把应用服务器返回的内容,原封不动地返回给Android/iOS移动应用。详情请参见Callback API文档。注意
在移动应用端设置上传回调
要让OSS在接收上传请求时触发上传回调,移动应用在构造上传请求时必须把如下内容指定到上传请求里面:
要回调到哪个服务器(callbackUrl),如 http://abc.com/callback.php,这个地址必须是公网能够访问的。
上传回调给应用服务器的内容(callbackBody),可以是上述OSS返回应用服务器系统变量的一个或者多个。
假如您的用户服务器上传回调地址是http://abc.com/callback.php。您想获取手机上传的文件名称、文件的大小,并且定义了x:phone变量是指手机型号,x:system变量是指操作系统版本。
上传回调示例分以下两种:
iOS指定上传回调示例:OSSPutObjectRequest * request = [OSSPutObjectRequest new];
request.bucketName = @'';
request.objectKey = @'';
request.uploadingFileURL = [NSURL fileURLWithPath:@'];
// 设置回调参数
request.callbackParam = @{
@'callbackUrl': @'http://abc.com/callback.php',
@'callbackBody': @'filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}'
};
// 设置自定义变量
request.callbackVar = @{
@'x:phone': @'iphone6s',
@'x:system': @'ios9.1'
};
Android指定上传回调示例:PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType('application/octet-stream');
put.setMetadata(metadata);
put.setCallbackParam(new HashMap() {
{
put('callbackUrl', 'http://abc.com/callback.php');
put('callbackBody', 'filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}');
}
});
put.setCallbackVars(new HashMap() {
{
put('x:phone', 'IPOHE6S');
put('x:system', 'YunOS5.0');
}
});
应用服务器收到的回调请求
根据设定的不同URL和回调内容,应用服务器收到的回调请求会所不同,示例如下:
POST /index.html HTTP/1.0
Host: 121.43.113.8
Connection: close
Content-Length: 81
Content-Type: application/x-www-form-urlencoded
User-Agent: ehttp-client/0.0.1
authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA==
x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==
filename=test.txt&size=5&photo=iphone6s&system=ios9.1
更多内容请参见Callback API文档。
应用服务器判断回调请求是否来自OSS
如果您的回调服务器被人恶意攻击了,例如恶意回调您的应用服务器,导致应用服务器收到一些非法的请求,影响正常逻辑,此时您就需要判断回调请求是否来自OSS。
判断的方法主要是根据OSS给应用服务器返回的头部内容中 x-oss-pub-key-url和authorization这两个参数进行RSA校验。只有通过RSA校验才能说明这个请求是来自OSS。本文提供的示例程序有实现的示例供您参考。
应用服务器收到回调请求后的处理
应用服务器在校验这个请求是来自OSS后,指定回调给应用服务器的内容格式,如
filename=test.txt&size=5&photo=iphone6s&system=ios9.1
应用服务器就可以根据OSS的返回内容,解析得到自己想要的数据。得到这个数据后,应用服务器可以把数据存放起来,方便后续管理。
OSS如何处理应用服务器的返回内容
有两种情况:
OSS将回调请求发送给应用服务器,但是应用服务器接收失败或者访问不通,OSS会返回给Android/iOS移动应用203的状态码,但是数据已经存放到OSS上了。
应用服务器接收到OSS的回调请求,并且正确返回了,OSS会返回给Android/iOS移动应用状态码200, 并把应用服务器返回给OSS的内容原封不动地返回给Android/iOS移动应用。
示例程序下载
示例程序只是完成了如何检查应用服务器收到的签名, 您需要自行增加对应用服务器收到回调内容的格式解析 。
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。
赞0
踩1