开发者社区> shinenuaa> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

OSS移动开发实战2 (30分钟快速搭建移动应用上传回调服务)

简介:
+关注继续查看

30分钟快速搭建移动应用上传回调服务

背景

上一篇文章我们介绍了如何快速搭建移动应用
参考移动端开发场景流程图
点击查看

上述图中Android/iOS移动应用的职责

会负责申请STS凭证,然后使用从应用服务器取的凭证上传

上述图中应用服务器的职责

负责给Android/iOS移动应用,生成STS凭证

上述图中OSS的职责

OSS负责处理移动应用的数据请求

问题

对于Android/iOS移动应来说,移动应用只需要执行操作1(申请STS凭证),就能调用多次5(使用该STS凭证上传数据到OSS)。这样就导致了应用服务器根本不知道用户都上传了哪些数据 ,如果那么作为该APP的开发者,就没法对应用上传数据进行管理。所以,有什么问题能让应用服务器感知到Android/iOS移动应用上传的数据呢?

答案

通过使用OSS的上传回调服务,就能解决上述问题,如下图:

即OSS在收到Android/iOS移动的数据(第5步)和在返回用户上传结果(第6步)之间,触发一个上传回调工作。即第5.5步。先回调用户服务器,然后得到应用服务器返回的内容,将这个内容返回给Android/iOS移动应用。

可以参考一下Callback API文档

上传回调的作用

通过上传回调可以让用户应用服务器知道当前上传文件的基本信息

基本信息如下表:

系统变量 含义
bucket 移动应用上传到哪个存储空间
object 移动应用上传到OSS保存的文件名
etag 该上传的文件的etag,即返回给用户的etag字段
size 该上传的文件的大小
mimeType 资源类型
imageInfo.height 图片高度
imageInfo.width 图片宽度
imageInfo.format 图片格式,如jpg、png,只以识别图片

返回上述变量的一个或者多个,返回内容格式形式在Android/iOS上传时指定

通过上传回调设定自定义参数,达到信息传递目的

如:假如我是一个开发者,我想知道当前用户所使用的APP版本、当前用户所在的操作系统版本、用户的GPS信息、用户的手机型号。那么我可以在Android/iOS端上传文件时,指定上述自定义参数 ,如x:version指定APP版本,x:system指定操作系统版本,x:gps指定GPS信息,x:phone指定手机型号
这些值,会在Android/iOS移动应用上传到OSS时,附带上。然后OSS,会把这些值,放到CallbackBody里面,一起发给应用服务器。这样应用服务器就能收到这些信息,达到信息传递的目的。

移动应用端怎么样设定上传回调?

要让OSS在接收上传请求时,触发上传回调,那么移动应用必须在构造上传请求,必须把要两个内容指定到上传请求里面。这两个内容如下:

  1. 要回调到哪个服务器callbackUrl,如上一点提到的http://abc.com/callback.php,注意这个地址必须是公网能够访问的
  2. 上传回调给应用服务器的内容callbackBody。可以是上述OSS返回应用服务器系统变量的一个或者多个。

举一个示例。假如我的用户服务器上传回调地址是:http://abc.com/callback.php

我想获取手机上传的文件名字,文件的大小,并且我定义了photo变量是指手机型号。system是操作系统版本

iOS指定上传回调示例

OSSPutObjectRequest * request = [OSSPutObjectRequest new];
request.bucketName = @"<bucketName>";
request.objectKey = @"<objectKey>";
request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];

// 设置回调参数
request.callbackParam = @{
                          @"callbackUrl": @"http://abc.com/callback.php",
                          @"callbackBody": @"filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}"
                          };
// 设置自定义变量
request.callbackVar = @{
                        @"x:photo": @"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<String, String>() {
    {
        put("callbackUrl", "http://abc.com/callback.php");
        put("callbackBody", "filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}");
    }
});

put.setCallbackVars(new HashMap<String, String>() {
     {
         put("x:photo", "IPOHE6S");
         put("x:system", "YunOS5.0");
     }
});

对于上传回调,应用服务器应该做些什么?

  1. 你必须要有部署一个可以接收POST请求的服务,这个服务必须有公网地址如www.abc.com/callback.php(或者外网IP也可以),不然OSS没有办法访问到这个地址。
  2. 你要给OSS正确的返回,返回格式必须是JSON格式,内容自定义。因为OSS会把应用服务器返回的内容,原封不动地返回给Android/iOS移动应用。(切记,返回给OSS的Response Header一定要加上Content-Length这个头部)

本教程在后续内容,为大家准备了多个语言版本的示例, 下载及运行方法在本教程的最后。

应用服务器收到的回调请求是怎么样

应用服务器收到OSS的请求,抓包的请求如下(这个结果会根据不同人设定的不同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后(这一步不是必要的),因为Android/iOS应用在上传数据时,指定了回调给应用服务器的内容格式,如

filename=test.txt&size=5&photo=iphone6s&system=ios9.1

应用服务器就可以根据OSS的返回内容,解析得到自己想要得到的数据。得到这个数据后,应用服务器可以把数据存放起来,方便后续管理。

应用服务器收到这个回调要怎么样返回给OSS

  1. 返回状态码是200;
  2. 返回必须是json格式的内容;
  3. 并且返回的头部必须带有Content-Length这个头部

OSS怎么样处理应用服务器的返回内容

有两种情况:

  1. OSS将回调请求发送给应用服务器,但是应用服务器接收失败或者访问不通,OSS会返回给Android/iOS移动应用203的状态码,但是数据已经存放到OSS上了。
  2. 应用服务器,接收到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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云OSS上传图片不能打开的解决办法
  最近项目需要把附件部署到阿里云oss,集成过程中发现上传的图片不能直接打开预览,只能下载到本地保存。   解决办法:设置ContentType   var endpoint="阿里云OSS EndPoint";   // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
1531 0
一站式极致读吞吐,加速业务数字化转型 - 阿里云对象存储 OSS加速器解析与实践
阿里云对象存储OSS重磅推出OSS加速器功能,提供高性能、高吞吐量的数据访问服务。
6069 0
阿里云云原生数据湖分析DLA Serverless Spark重磅发布,助力企业低成本挖掘OSS数据价值
由于解决了用户当前遇到的数据分散、复杂、难管理的问题,数据湖方案越来越深入人心,阿里云DLA产品提供了一体化解决方案,从数据湖管理到数据湖分析和计算。相对于在线引擎,Spark更适合弹性计算架构,可以跟云原生的弹性能力深度整合起来。从传统IDC到搬站上云到完全Serverless化,这条路径已经被越来越被认可为云技术的发展路径。DLA Spark采用完全云原生 + Serverless形式,相对于传统的自建Hadoop在性价比方面拥有数倍的优势。
2816 0
最佳实践:使用阿里云CDN加速OSS访问
用户直接访问OSS资源,访问速度会受到OSS的下行带宽以及Bucket地域的限制。如果通过CDN来访问OSS资源,带宽上限更高,并且可以将OSS的资源缓存至就近的CDN节点,通过CDN节点进行分发,访问速度更快,且费用更低。如果采用动静分离的网站架构,就能够解决海量用户访问的性能瓶颈问题。
1380 0
阿里云云原生数据湖分析DLA SQL(兼容Presto) CU版重磅发布,助力企业低成本分析OSS数据价值
Presto作为OLAP界领先的分析引擎在国内外有着广泛的应用,各个公司要么在自己的机房自建Presto,要么在云上使用ECS自建Presto来使用,但是开源的Presto在用户学习成本、数据摄入、生态兼容性、高可用、对云上数据的支持度方面还是有一些薄弱。因此阿里云数据湖分析团队打造了一个DLA SQL(兼容Presto)CU版本,今天给大家介绍一下它的一些特性。
1445 0
阿里云云原生数据湖分析DLA重磅发布-数据湖管理,助力企业一站式管理OSS数据湖存储数据
数据湖当前在国内外是比较热的方案,MarketsandMarkets市场调研显示预计数据湖市场规模在2024年会从2019年的79亿美金增长到201亿美金。一些企业已经构建了自己的云原生数据湖方案,有效解决了业务痛点;还有很多企业在构建或者计划构建自己的数据湖。阿里云数据湖分析服务DLA的数据湖管理功能定位为帮助用户构建统一、安全、高效、开放的数据湖解决方案。
3906 0
重磅:阿里云 JindoFS SDK 全面开放使用,OSS 文件各项操作性能得到大幅提升
本文主要介绍如何使用JindoFS SDK来访问OSS对象存储,以及使用它来提升我们操作OSS文件的性能。值得一提的是,此前JindoFS SDK 仅限于E-MapReduce产品内部使用,此次全方位面向整个阿里云OSS用户放开,并提供官方维护和支持技术,欢迎广大用户集成和使用。
5003 0
提升 10 倍!阿里云对象存储 OSS 可用性 SLA 技术揭秘
对象存储被广泛应用于互联网应用中,当我们打开手机观看视频、收听音乐、分享图片、浏览网页、淘宝购物时,背后的数据基本都是存在对象存储中。应用使用卡、打不开就和对象存储的可用性 SLA 有关,SLA 越高,应用体验越好。本文分享阿里云在对象存储 OSS(Open Storage Service) 的可用性 SLA (Service Level Agreement) 上的实践和技术沉淀。
1626 0
快开启阿里云对象存储 OSS 防误删新功能--版本控制,保护您珍贵的数据
阿里云对象存储 OSS 是保存海量数据的平台,支持丰富的应用。在使用过程中难免会遇到误操作、程序 Bug、覆盖写等导致数据被删除的场景,对于数据的丢失会非常着急,后果也非常严重,甚至某些情况下还会影响你的职业生涯。
1659 0
+关注
文章
问答
来源圈子
更多
阿里云存储基于飞天盘古2.0分布式存储系统,产品包括对象存储OSS、块存储Block Storage、共享文件存储NAS、表格存储、日志存储与分析、归档存储及混合云存储等,充分满足用户数据存储和迁移上云需求,连续三年跻身全球云存储魔力象限四强。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
云存储之OSS实战进阶分享
立即下载
阿里云 JindoFS+OSS 数据上云实战
立即下载
OSS运维进阶实战手册
立即下载