版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、对象存储 OSS最佳实践OSS/最佳实践OSS/最佳实践 PAGE 109 PAGE 109最佳实践应用服务器 背景这是一个移动互联的时代。手机APP上传的数据会越来越多。把数据存储的问题交给OSS, 让开发者能更加专注于自己的应用逻辑。 那么怎么样基于OSS构建一个APP存储系统呢?目的本教程就是让你在30分钟内搭建一个基于OSS的移动应用数据直传服务,所谓直传就是移动应用的数据的上传 和下载直接直连OSS,只有控制流走用户自己的服务器。安全的上传下载方式(临时,灵活的赋权鉴权),成本低(这样用户不需要准备很多服务器,因为移动应用直联云存储,只有控制流走用户自己的应用 服务器。)高并发,支持
2、海量用户(OSS有海量的上传和下载带宽)弹性(OSS有无限扩容的存储空间)方便(可以方便的对接到媒体转码服务-视频多端适配,图片处理服务,CDN加速下载等)架构图本教程就是让你在30分钟内搭建一个基于OSS的移动应用数据直传服务详细可以参考这里角色解析Android/iOSAPP;OSS,即阿里云对象存储,负责存储APP上传的数据,可以参考官网介绍;RAM/STS负责生成临时上传凭证;用户应用服务器,即提供该Android/iOS应用的开发者开发的APP后台服务,管理APP上传和下载的Token. 甚至是用户在APP上传数据元数据信息。数据流解析Android/iOS应用不可能直接存储Acce
3、ssKeyID/AccessKeySecret,这样会存在泄密的风险。所以 应用必须向用户的应用服务器申请一个临时上传凭证(注意下文将此临时上传凭证称为Token),注意 这个Token是有时效性的,如这个Token的过期时间是30分钟(这个时间可以由应用服务器指定),那么在该Android/iOS应用在这30分钟里面,使用这个Token可以从OSS上传和下载数据, 30分钟后再重新获取。用户的应用服务器检测上述请求的合法性,然后返回Token给应用。手机拿到这个Token后就可以将数据上传到OSS,或者从OSS下载数据了。本教程的目的就是,介绍下述红色和蓝色框的内容应用服务器如何生成这个To
4、ken,蓝色方框效果本教程实现了一个APP,如下,大家可以扫描二维码,安装一下示例APP程序,这上工具是用Android开发。 但是本教程的应用服务器搭建也适用于iOS, 即上述图蓝色的框的内容。示例程序的体验示例程序的最终效果图如下:应用服务器:该移动应用对应的后台应用服务器。本教程搭建了一个后台应用服务器: HYPERLINK http:/oss-/ http:/oss- /app-server/sts.php上传Bucket,指的是该移动应用要把数据上传到哪个Bucket 区域:指的第二步指定的Bucket对应的区域。示例APP的使用可以点击选择图片,然后就把文件上传到OSS,上传的方法
5、,支持普通上传和断点上传。注意在一些网络环境差的环境下,最 好用断点上传。然后可以利用图片处理服务,可以对将上传的图片进行缩略和加水印处理。初始使用请暂时先不要改应用服务 可以点击选择图片,然后就把文件上传到OSS,上传的方法,支持普通上传和断点上传。注意在一些网络环境差的环境下,最 好用断点上传。然后可以利用图片处理服务,可以对将上传的图片进行缩略和加水印处理。初始使用请暂时先不要改应用服务 器地址和Bucket名字搭建这样一个APP上传和下载的系统 ,需要准备的东西:我必须开通了OSS,并且创建了Bucket,bucket:sdk-demo我必须开通STS服务。开通STS服务其实是为了如何
6、生成上述所描述的Token我必须搭建这样一个应用服务器。这在个事例里面,我搭建的应用服务器的地址是: HYPERLINK http:/oss-/ http:/oss- /app-server/sts.php . 注意:这个例子本教程是采用PHP编写的,但是事实上,用户可以选择自己喜欢的语言进行编写,如Java 、Python、 Go、Ruby、Node.js、C#等编写。为帐号开通STS服务1. 如果已经有bucket可以忽略这一步, 如果没有bucket,创建Bucket参考官网1. 第二步操作,开通STS,可以参考 如下: (1)要开通STS服务,首先OSS登陆官网控制台(2)登录管理控制
7、台,点击:安全令牌快捷配置RAM,会弹出开通的对话框。直接点开通,这个要求实名验 (4)点击开始授权后,系统会进行自动授权,请千万保存如下图框住的三个参数点击保存AK信息后,对话框会关闭。保存好下面标红的结果3.保存这三个参数后。到这一步,STS的开通已经完成了。 注意如果您之前已经点击这个页面创建了AccessKeyId/AccessKeySecrte, 弹出的页面如下:点击如下图所示的查看点击如下图所示的创建AccessKey记下如下参数1,2并记下如下参数3:保存这三个参数后。到这一步,STS的开通已经完成了。讲解一下应用服务器的搭建。为了方便大家开发。 本教程准备了三个语言的版本示例程
8、序 (Java、PHP、Ruby)应用服务器代码示例的下载PHP: 下载地址Java: 下载地址Ruby: 下载地址应用服务器示例的配置AccessKeyID : , AccessKeySecret : , RoleArn : , TokenExpireTime : 900,AccessKeyID : , AccessKeySecret : , RoleArn : , TokenExpireTime : 900,PolicyFile: policy/all_policy.txt下面对配置进行讲解。AccessKeyID填写上述图标红的1的内容,即用户自己在全AccessKeySecret填写上
9、述图片标红2的内容RoleArn3的内容TokenExpireTime 指Android/iOS应用取到这个Token的失效时间,注意,最少是900s, 默认值可以不修改,PolicyFile: 填写的是该该Token所要拥有的权限列表的文件, 默认值可以不改 本教程准备了三种最常用token 权限文件,放于policy目录下面。分别是 all_policy.txt : 指定了该token拥有对该帐号下,创建Bucket、删除Bucket、上传文件、下载文件、删除文件的权限 。 bucket_read_policy.txt : 指定了该token拥有该帐号下,对指定Bucket的权限。 buc
10、ket_read_write_policy.txt: 指定了该token拥有该帐号下,对指定Bucket的权限。如果你想要指定这个Token只能对指定的bucket有读写权限, 请把(bucket_read_policy.txt、bucket_read_write_policy.txt)这个文件里面$BUCKET_NAME直接替换成指定的bucket名字。status:200, AccessKeyId:STS.3pYjsdgdgagdasdg, status:200, AccessKeyId:STS.3pYjsdgdgagdasdg, AccessKeySecret:rpnwO9kvEgetG
11、drddgsR2YrTtI,Security:CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s3qaPer8p1YaX1 NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZ ajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOi
12、o6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZ XJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVtbzI=,Expiration:2015-12-12T07:49:09Z,status:表示获取Token的状态,获取成功时,返回值是200 AccessKeyId: 表示Android/iOS应用初始化OSSClient获取的 AccessKeyId AccessKeySecret: 表示Android/iOS应用初始化OSSClient获取AccessKeySecret
13、SecurityToken:表示Android/iOS应用初始化的Token Expiration: 表示该Token失效的时间。主要在Android SDK会自动判断是否失效,自动获取Token 注意上述这四个变量将构成了一个Token。代码示例的运行方法PHP运行的,将包下载 后,然后修改好config.json这个文件。直接运行php sts.php 即能生成Token,将程序部署到指定的地址。PHP运行的,将包下载 后,然后修改好config.json这个文件。直接运行php sts.php 即能生成Token,将程序部署到指定的地址。对于JAVA版本 (依赖于java 1.7)下载编
14、译好的jar 包,下载地址: 下载后解压:下载编译好的jar 包,下载地址: 下载后解压:运行方法:java -jar oss-token-server.jar (port)如果不指定port(端口), 直接运行java -jar oss-token-server.jar , 程序会监听7080端口如果想让程序执行在9000端口,运行java -jar oss-token-server.jar 9000 , 其他端口也类似。体验自己的APP上传应用服务器::8080,选择自己数据要上传到哪个bcuket及区域,修改示例APP程序里面相应Bucket及区域。点击设置按钮,将配置加载。选择图片,设
15、置上传OSS文件名,上传。然后就可以在Android上体验OSS服务了。这样你就能通Android 示例程序将数据直接上传到OSS了上传成功后,可以看一下数据是否在OSS上了核心代码解析-OSS初始化下面讲解一下如何 利用Android/iOS SDK跟自己的应用服务器,请求Token- Android版本/初始化一个OssService用来上传下/初始化一个OssService用来上传下publicOssServiceinitOSS(Stringendpoint,Stringbucket,UIDisplayerdisplayer) OSSCredentialProvidercredentia
16、lProvider;/使用自己的获取STSToken的类/从应用服务器控件里面读取应用服务器地址String stsServer = (EditText) findViewById(R.id.stsserver).getText().toString();/STSGetter类,封装如何跟从应用服务器取数据,必须继承于OSSFederationCredentialProvider这个类。 取Token这个取决于你所写的APP跟应用服务器数据的协议设计。/STSGetter类,封装如何跟从应用服务器取数据,必须继承于OSSFederationCredentialProvider这个类。 取Tok
17、en这个取决于你所写的APP跟应用服务器数据的协议设计。if (stsServer .equals() credentialProvider = new STSGetter();else credentialProvider = new STSGetter(stsServer);/获取控件上的bucket名字bucket = (EditText) findViewById(R.id.bucketname).getText().toString();/初始化OSSClientClientConfiguration conf = new ClientConfiguration(); conf.se
18、tConnectionTimeout(15 * 1000); / 连接超时,默认15秒conf.setSocketTimeout(15 * 1000); / socket超时,默认15秒conf.setMaxConcurrentRequest(5); / 最大并发请求书,默认5个conf.setMaxErrorRetry(2); / 失败后最大重试次数,默认2次OSSoss=newOSSClient(getApplicationContext(),endpoint,credentialProvider,conf); return new OssService(oss, bucket,displ
19、ayer);- iOS版本/ 初始化一个OSSClient实例/ 初始化一个OSSClient实例- (void)ossInit / 构造一个获取STSToken的凭证提供器idcredential=OSSFederationCredentialProvideralloc initWithFederationTokenGetter:OSSFederationToken */ 实现一个函数,同步返回从server获取到的STSToken return self getFederationToken;/ 用endpoint、凭证提供器初始化一个OSSClientclient = OSSClient
20、 alloc initWithEndpoint:endPoint credentialProvider:credential;核心代码解析-移动应用从应用服务器取Token具体APP从就应用服务器取Token方法,必须写到public OSSFederationToken getFederationToken() 这return new OSSFederationToken(aksktokenexpiration)ak, sktokenexpiration在本例子里,示例如下,注意用户可以自定义自己的移动应用跟自己应用服务器之前的协议。- Android版本public OSSFederati
21、onToken getFederationToken() String stsJson;public OSSFederationToken getFederationToken() String stsJson;OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(stsServer).build();try try Response response = client.newCall(request).execute(); if (response.isSuccessful()
22、 stsJson = response.body().string(); else throw new IOException(Unexpected code + response);catch (IOException e) e.printStackTrace(); Log.e(GetSTSTokenFail, e.toString(); return null;try JSONObject jsonObjs = new JSONObject(stsJson); String ak = jsonObjs.getString(AccessKeyId); String sk = jsonObjs
23、.getString(AccessKeySecret); String token = jsonObjs.getString(SecurityToken); String expiration = jsonObjs.getString(Expiration);return new OSSFederationToken(ak, sk, token, expiration);catch (JSONException e) Log.e(GetSTSTokenFail, e.toString(); e.printStackTrace();return null;- iOS版本NSURL * url =
24、 NSURL URLWithString:STSServer; NSURLRequestNSURL * url = NSURL URLWithString:STSServer; NSURLRequest*request=NSURLRequestrequestWithURL:url;OSSTaskCompletionSource*tcs=OSSTaskCompletionSourcetaskCompletionSource; NSURLSession * session = NSURLSessionsharedSession;NSURLSessionTask * sessionTask = se
25、ssion dataTaskWithRequest:requestcompletionHandler:(NSData*data,NSURLResponse*response,NSError*error) if (error)tcs setError:error; return;tcs setResult:data;sessionTask resume;/ 实现这个回调需要同步返回Token,所以要waitUntilFinished tcs.task waitUntilFinished;if (tcs.task.error) / 如果网络请求出错,返回nil表示无法获取到Token。该次请求OS
26、S会失败。return nil; else /JSON串拿到Token的各个字段,组成STSToken返回NSDictionary * objectNSJSONSerialization JSONObjectWithData:tcs.task.resultoptions:kNilOptions error:nil;OSSFederationToken * token = OSSFederationToken new;ni token.tAccessKey = object objectForKey:AccessKeyId; token.tSecretKey = object objectFor
27、Key:AccessKeySecret; token.tToken = object objectForKey:SecurityToken; OSSFederationToken * token = OSSFederationToken new;ni token.tAccessKey = object objectForKey:AccessKeyId; token.tSecretKey = object objectForKey:AccessKeySecret; token.tToken = object objectForKey:SecurityToken; token.expiration
28、TimeInGMTFormat = object objectForKey:Expiration;return token;OSS相关功能的代码,可以查看示例程序的实现该Android示例程序的源码下载地址该iOS示例程序的源码下载地址应用服务器代码示例的下载PHP: 下载地址Java: 下载地址Ruby: 下载地址node.js: 下载地址搭建应用服务器之STS Policy上一篇文章中介绍了如何快速搭建应用服务器,在本文中会基于上文提到的应用服务器,以上海的Bucket app-base-oss为例子,配置不同的Policy以实现不同的权限控制。 以下说明中假设你已经开通了STS,并完全阅
29、读了上一篇文章。以下提到的Policy都是上文提到的config.json中指定的Policy文件的内容。 以下讲述的获取STS Token 后对OSS操作指的是应用服务器指定Policy,从STS获取临时凭证后,应用通过临时凭证访问OSS。常见Policy完全授权的PolicyStatement: 上文为了演示方便,默认Policy如下,表示的意思是允许应用对所有OSS的操作。这对移动应用来说也是不安 全的授权,不推荐Statement: Action: oss:*,Effect: Allow, Resource: acs:oss:*:*:*,Version: 1获取STS Token 后对
30、OSS操作结果列出所有创建的Bucket成功上传不带前缀的Object,test.txt成功下载不带前缀的Object, test.txt成功上传带前缀的Object, user1/test.txt成功下载带前缀的Object, user1/test.txt成功列出Object, test.txt成功带前缀的Object, user1/test.txt成功只读不写的Policy不限制前缀的只读不写Policy这个Policy表示,应用可以对Bucket app-base-oss下所有的Object可列举,可下载。Statement: Action: oss:GetObject, oss:Lis
31、tObjects,Effect: Allow,Resource: acs:oss:*:*:app-base-oss/*, acs:oss:*:*:app-base-oss,Version: 1获取STS Token 后对OSS操作结果列出所有创建的Bucket失败上传不带前缀的Object,test.txt失败下载不带前缀的Object, test.txt成功上传带前缀的Object, user1/test.txt失败下载带前缀的Object, user1/test.txt成功列出Object, test.txt成功带前缀的Object, user1/test.txt成功限制前缀的只读不写Po
32、licy这个Policy表示,应用可以对Bucket app-base-oss下带有前缀user1/的Object可列举,可下载。但无法下载其他前缀的Object。 这样不同的应用如果对应不同的前缀,就可以达到在同一个bucket中空间隔离的效果。Statement: Action: oss:GetObject, oss:ListObjects,Effect: Allow,Resource: acs:oss:*:*:app-base-oss/user1/*, acs:oss:*:*:app-base-oss,Version: 1获取STS Token 后对OSS操作结果列出所有创建的Bucke
33、t失败上传不带前缀的Object,test.txt失败下载不带前缀的Object, test.txt失败上传带前缀的Object, user1/test.txt失败下载带前缀的Object, user1/test.txt成功列出Object, test.txt成功带前缀的Object, user1/test.txt成功只写不读的Policy不限制前缀的只写不对PolicyStatement: Statement: Action: oss:PutObject,Effect: Allow,Resource: acs:oss:*:*:app-base-oss/*, acs:oss:*:*:app-b
34、ase-oss,Version: 1获取STS Token 后对OSS操作结果列出所有创建的Bucket失败上传不带前缀的Object,test.txt成功下载不带前缀的Object, test.txt失败上传带前缀的Object, user1/test.txt成功下载带前缀的Object, user1/test.txt失败列出Object, test.txt失败带前缀的Object, user1/test.txt失败限制前缀的只写不读Policy这个Policy表示,应用可以对Bucket app-base-oss下带有前缀user1/的Object可上传。但无法上传其他前缀的Object。
35、 这样不同的应用如果对应不同的前缀,就可以达到在同一个bucket中空间隔离的效果。Statement: Action: oss:PutObject,Effect: Allow,Resource: acs:oss:*:*:app-base-oss/user1/*, acs:oss:*:*:app-base-oss,Version: 1获取STS Token 后对OSS操作结果列出所有创建的Bucket失败上传不带前缀的Object,test.txt失败下载不带前缀的Object, test.txt失败上传带前缀的Object, user1/test.txt成功下载带前缀的Object, use
36、r1/test.txt失败列出Object, test.txt失败带前缀的Object, user1/test.txt失败读写的Policy不限制前缀的读写Policy这个Policy表示,应用可以对Bucket app-base-oss下所有的Object可列举,可下载,可上传和删除。Statement: Action: oss:GetObject, oss:PutObject, oss:DeleteObject, oss:ListParts,oss:AbortMultipartUpload, oss:ListObjects,Effect: Allow,Resource: acs:oss:*
37、:*:app-base-oss/*, acs:oss:*:*:app-base-oss,Version: 1获取STS Token 后对OSS操作结果列出所有创建的Bucket失败上传不带前缀的Object,test.txt成功下载不带前缀的Object, test.txt成功上传带前缀的Object, user1/test.txt成功下载带前缀的Object, user1/test.txt成功列出Object, test.txt成功带前缀的Object, user1/test.txt成功限制前缀的读写Policy这个Policy表示,应用可以对Bucket app-base-oss下带有前缀
38、user1/的Object可列举,可下载,可上传和删除。但无法对其他前缀的Object进行读写。 这样不同的应用如果对应不同的前缀,就可以达到在同一个bucket中空间隔离的效果。Statement: Action: oss:GetObject, oss:PutObject, oss:DeleteObject, oss:ListParts,oss:AbortMultipartUpload, oss:ListObjects,Effect: Allow,Resource: acs:oss:*:*:app-base-oss/user1/*, acs:oss:*:*:app-base-oss,Vers
39、ion: 1获取STS Token 后对OSS操作结果列出所有创建的Bucket失败上传不带前缀的Object,test.txt失败下载不带前缀的Object, test.txt失败上传带前缀的Object, user1/test.txt成功下载带前缀的Object, user1/test.txt成功列出Object, test.txt成功带前缀的Object, user1/test.txt成功小结从上面的例子可以看出可以根据不同的应用场景制定不同的Policy,然后对应用服务器稍作修改就可以实现对不用的应用用 户实现不同的权限控制。另外也可以在应用端做优化,在STSToken过期之前不需要向
40、应用服务器再次请求。这里就不多讲。需要特别注意的是Token实际颁发是由STS颁发的,应用服务器相当于定制了Policy,向STS请求Token,然后将TokenToken是一个简略的说法。实际上包含了这些在OSS提供给应用的SDK中 SDK的实现。更多参考资料RAM和STS在OSS中的使用指南RAM官方文档和STS官方文档30分钟快速搭建移动应用上传回调服务背景上一篇文章我们介绍了如何快速搭建移动应用 参考移动端开发场景流程图 点击查看上述图中Android/iOS移动应用的职责会负责申请STS凭证,然后使用从应用服务器取的凭证上传上述图中应用服务器的职责负责给Android/iOS移动应用
41、,生成STS凭证上述图中OSS的职责OSS负责处理移动应用的数据请求问题对于Android/iOS移动应来说,移动应用只需要执行操作1(申请STS凭证),就能调用多次5(使用该STS凭证 上传数据到OSS)。这样就导致了应用服务器根本不知道用户都上传了哪些数据 ,如果那么作为该APP的开发者,就没法对应用上传数据进行管理。所以,有什么问题能让应用服务器感知到Android/iOS移动应用上传的数 据呢?答案通过使用OSS的上传回调服务,就能解决上述问题,如下图:即OSS在收到Android/iOS移动的数据(第5步)和在返回用户上传结果(第6步)之间,触发一个上传回调工作。即第5.5步。先回调
42、用户服务器,然后得到应用服务器返回的内容,将这个内容返回给Android/iOS移动应用。可以参考一下Callback API文档上传回调的作用通过上传回调可以让用户应用服务器知道当前上传文件的基本信息基本信息如下表:系统变量含义bucket移动应用上传到哪个存储空间object移动应用上传到OSS保存的文件名etag该上传的文件的etag,即返回给用户的etag字段size该上传的文件的大小mimeType资源类型imageInfo.height图片高度imageInfo.width图片宽度imageInfo.format图片格式,如jpg、png,只以识别图片返回上述变量的一个或者多个,返
43、回内容格式形式在Android/iOS上传时指定通过上传回调设定自定义参数,达到信息传递目的如:假如我是一个开发者,我想知道当前用户所使用的APP版本、当前用户所在的操作系统版本、用户的GPS信息、用户的手机型号。那么我可以在Android/iOS端上传文件时,指定上述自定义参数 ,如x:version指定APP版本,x:system指定操作系统版本,x:gps指定GPS信息,x:phoneOSS时,附带上。然后OSS,会把这些值,放到CallbackBody里面,一起发给应 用服务器。这样应用服务器就能收到这些信息,达到信息传递的目的。移动应用端怎么样设定上传回调?要让OSS在接收上传请求时
44、,触发上传回调,那么移动应用必须在构造上传请求,必须把要两个内容指定到上 传请求里面。这两个内容如下:如上一点提到的 HYPERLINK /callback.php /callback.php,注意这个地址必须 是公网能够访问的上传回调给应用服务器的内容callbackBody。可以是上述OSS返回应用服务器系统变量的一个或者 多个。举一个示例。假如我的用户服务器上传回调地址是: HYPERLINK /callback.php /callback.php。我想获取手机上传的文件名字,文件的大小,并且我定义了photo变量是指手机型号。system是操作系统版本OSSPutObjectReque
45、st*OSSPutObjectRequest*request=OSSPutObjectRequestnew; request.bucketName =;request.objectKey = ;request.uploadingFileURL = NSURL fileURLWithPath:;/ 设置回调参数request.callbackParam = callbackUrl: HYPERLINK /callback.php /callback.php,callbackBody: filename=$object&size=$size&photo=$x:photo&system=$x:sys
46、tem;/ 设置自定义变量request.callbackVar = x:photo: iphone6s,x:system: ios9.1;PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath);ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(application/octet-stream);put.setMetadata(metadata);PutObjectRequest put =
47、 new PutObjectRequest(testBucket, testObject, uploadFilePath);ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(application/octet-stream);put.setMetadata(metadata);put.setCallbackParam(new HashMap() put(callbackUrl, HYPERLINK /callback.php /callback.php);put(callbackBody, filen
48、ame=$object&size=$size&photo=$x:photo&system=$x:system););put.setCallbackVars(new HashMap() put(x:photo, IPOHE6S);put(x:system, YunOS5.0););对于上传回调,应用服务器应该做些什么?你必须要有部署一个可以接收POST请求的服务,这个服务必须有公网地址如 HYPERLINK /callback.php 或者外网IP也可以),不然OSS没有办法访问到这个地址。你要给OSS正确的返回,返回格式必须是JSON格式,内容自定义。因为OSS会把应用服务器返回的 内容,原封
49、不动地返回给Android/iOS移动应用。(切记,返回给OSS的Response Header一定要加上Content-Length这个头部)本教程在后续内容,为大家准备了多个语言版本的示例, 下载及运行方法在本教程的最后。应用服务器收到的回调请求是怎么样POST /index.html HTTP/1.0 Host: Connection: close Content-Length: 81POST /index.html HTTP/1.0 Host: Connection: close Content-Length: 81Content-Type: application/x-www-for
50、m-urlencoded User-Agent: ehttp-client/0.0.1authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA= x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ=filename=test.txt&size=5&photo=iphone6s&system=ios9.1filename=te
51、st.txt&size=5&photo=iphone6s&system=ios9.1可以参考一下Callback API文档应用服务器怎么样判断这个请求是来自OSS之所以要判断这个请求是来自OSS,是因为如果你的回调服务器被人恶意攻击了,别人恶意回调你的应用服务 器,导致应用服务器收到一些非法的请求,影响正常逻辑。 判断的方法主要是利用OSS给应用服务器返回的头部内容中, x-oss-pub-key-url,authorization这两个参数进行RSA校验。只有通过RSA校验的请求,才能说明这个请求是来自OSS,本教程提供的示例程序都有实现的示例,大家可以参考。应用服务器收到这个回调做什么f
52、ilename=test.txt&size=5&photo=iphone6s&system=ios9.1应用服务器在校验这个请求是来自OSS后(这一步不是必要的),因为Android/iOS应用在上传数据时,指定 了回调给应用服务器的内容格式,如filename=test.txt&size=5&photo=iphone6s&system=ios9.1应用服务器就可以根据OSS的返回内容,解析得到自己想要得到的数据。得到这个数据后,应用服务器可以把 数据存放起来,方便后续管理。应用服务器收到这个回调要怎么样返回给OSS返回状态码是200;返回必须是json格式的内容;并且返回的头部必须带有Con
53、tent-Length这个头部OSS怎么样处理应用服务器的返回内容有两种情况:,OSS会返回给Android/iOS移动应用203的状态码,但是数据已经存放到OSS上了。应用服务器,接收到OSS的回调请求,并且正确返回了,OSS会返回给Android/iOS移动应用状态码 是200,OSS的内容,原封不动地返回给Android/iOS移动应用.上传回调服务器示例程序下载示例程序只是完成了如何检查应用服务器收到的签名, 用户要自行增加对应用服务器收到回调的内容的格式解析 。 Java版本:下载地址:点击这里运行方法,解压包运行java -jar oss-callback-server-demo.
54、jar 9000(9000就运行的端口,可以自己指定)注意这个jar例子在java 1.7运行通过,如果有问题可以自己依据提供的代码进行修改。这是一个maven项目PHP版本:下载地址:点击这里运行方法:部署到Apache环境下,因为PHP本身语言的特点,取一些数据头部会依赖于环境。所以 可以参考例子基于自己所在环境进行修改Python版本:下载地址:点击这里运行方法:解压包直接运行python callback_app_server.py即可,程序自实现了一个简单的http server,运行该程序可能需要安装rsa的依赖。Ruby版本:下载地址:点击这里rubyaliyun_oss_cal
55、lback_server.rbWeb端直传实践目的本教程的目录是通过三个例子介绍如何在Html表单提交直传OSS第一个例子:讲解签名在客户端(Javascript)完成,然后直接通过表单上传到OSS, 注意这个例子有安全风险,推荐使用第二个例子和第三个例子第二个例子:讲解签名在服务端(php)完成,然后直接通过表单上传到OSS第三个例子:讲解签名在服务端(php)完成, 并且服务端面设置了上传后回调。然后直接通过表单上传到OSS,OSS回调完应用服务器再返回给用户。背景每个用OSS的用户,都会用到上传。由于是网页上传,其中包括一些APP里面的h5页面,对上传的需求很强烈,很多人采用的做法是用户
56、在浏览器/APP上传到应用服务器,然后应用服务器再把文件上传到OSS。这种方法有三个缺点:第一:上传慢,先上传到应用服务器,再上传到OSS,网络传送多了一倍,而且OSS是采用BGP带宽,能保证各地各运营商的速度。第二:扩展性不好,如果后续用户多了,应用服务器会成为瓶颈。第三:费用高,因为OSS上传流量是免费的。如果数据直传到OSS,不走应用服务器。那么将能省下 几台应用服务器。基础篇:客户端用JS直接签名,然后上传到OSS点击这里打开示例进阶篇:应用服务器php返回签名点击这里打开示例终级篇-应用服务器php返回签名及采用上传回调点击这里打开示例PC_Web直传实践Web端直传实践-JS客户端
57、签名直接上传背景可以参考:点击这里打开背景介绍基础篇:客户端用JS直接签名,然后上传到OSS示例下面我将介绍用plupload ,在JS端签名然后直传数据到OSS的例子 用户电脑浏览器测试样例:点击这里打开示例用手机测试该上传是否有效。二维码:可以用手机(微信,QQ,手机浏览器等)扫一扫试试(这个不是广告,只是上述网址的二维码。这为了让大家看一下这个实现能在手机端完美运行。)文件上传是上传到一个测试的公共 bucket , 会定时清理,所以不要传一些敏感及重要数据。代码下载点击这里:oss-h5-upload-js-direct.zip原理本例子的功能采用pluploadPostObject)
58、到OSS支持html5,flash,silverlight,html4可以运行在PC浏览器,手机浏览器,微信等可以选择多文件上传显示上传进度条可以控制上传文件的大小可以设置上传到指定目录和设置上传文件名字是随机文件名还是本地文件名;OSS的PostObject API细节可以参照这里。pluploadplupload是一款简单易用且功能强大, 拥有多种上传方式,(html5, flash, silverlight, html4)等方式,会智能检测当前环境 选择最适合的方式,并且会优先采用Html5, 所以不用花心思去当前的浏览器要用何种方式上传,plupload会帮您考虑好。关键代码var u
59、ploader = new plupload.Uploader( runtimes : html5,flash,silverlight,html4, browse_button : selectfiles,/runtimes : flash,var uploader = new plupload.Uploader( runtimes : html5,flash,silverlight,html4, browse_button : selectfiles,/runtimes : flash,container: document.getElementById(container), flash_
60、swf_url : lib/plupload-2.1.2/js/Moxie.swf, silverlight_xap_url : lib/plupload-2.1.2/js/Moxie.xap, url : host,multipart_params: Filename: $filename,key : $filename, policy: policyBase64,OSSAccessKeyId: accessid,success_action_status : 200, /让服务端返回200,不然,默认会返回204 signature: signature,在这里有一点可以注意一下。就是Fi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年股份代持协议
- 颧部褐青色痣病因介绍
- 阿洪病病因介绍
- 全国赛课一等奖初中统编版七年级道德与法治上册《正确对待顺境和逆境》获奖课件
- 《电机技术应用》课件 2.1.1 异步电动机结构
- 幼儿园2024-2025学年度园务工作计划
- (范文)花瓶项目立项报告
- (2024)茶业初精制加工生产线技术改造项目可行性研究报告写作模板
- 2023年氢氧化锶项目融资计划书
- 【CSA GCR】大语言模型威胁分类
- 心理健康与大学生活学习通超星期末考试答案章节答案2024年
- 借款协议(父母借款给子女买房协议)(二篇)
- 外研版英语2024七年级上册全册单元知识清单(记忆版)
- 国家开放大学电大本科《工程经济与管理》2023-2024期末试题及答案(试卷代号:1141)
- 歌唱语音智慧树知到期末考试答案章节答案2024年齐鲁师范学院
- 国开(甘肃)2024年春《地域文化(专)》形考任务1-4终考答案
- MOOC 美在民间-南京农业大学 中国大学慕课答案
- 国家开放大学《Python语言基础》实验1:Python 基础环境熟悉参考答案
- 《中国心力衰竭诊断和治疗指南2024》解读
- 中国马克思主义与当代课后习题答案
- 【拓展阅读】类文阅读《王羲之吃墨》
评论
0/150
提交评论