版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、對象存儲 OSS最佳實(shí)踐OSS/最佳實(shí)踐OSS/最佳實(shí)踐 PAGE 109 PAGE 109最佳實(shí)踐應(yīng)用服務(wù)器 背景這是一個移動互聯(lián)的時代。手機(jī)APP上傳的數(shù)據(jù)會越來越多。把數(shù)據(jù)存儲的問題交給OSS, 讓開發(fā)者能更加專注于自己的應(yīng)用邏輯。 那么怎么樣基于OSS構(gòu)建一個APP存儲系統(tǒng)呢?目的本教程就是讓你在30分鐘內(nèi)搭建一個基于OSS的移動應(yīng)用數(shù)據(jù)直傳服務(wù),所謂直傳就是移動應(yīng)用的數(shù)據(jù)的上傳 和下載直接直連OSS,只有控制流走用戶自己的服務(wù)器。安全的上傳下載方式(臨時,靈活的賦權(quán)鑒權(quán)),成本低(這樣用戶不需要準(zhǔn)備很多服務(wù)器,因?yàn)橐苿討?yīng)用直聯(lián)云存儲,只有控制流走用戶自己的應(yīng)用 服務(wù)器。)高并發(fā),支持
2、海量用戶(OSS有海量的上傳和下載帶寬)彈性(OSS有無限擴(kuò)容的存儲空間)方便(可以方便的對接到媒體轉(zhuǎn)碼服務(wù)-視頻多端適配,圖片處理服務(wù),CDN加速下載等)架構(gòu)圖本教程就是讓你在30分鐘內(nèi)搭建一個基于OSS的移動應(yīng)用數(shù)據(jù)直傳服務(wù)詳細(xì)可以參考這里角色解析Android/iOSAPP;OSS,即阿里云對象存儲,負(fù)責(zé)存儲APP上傳的數(shù)據(jù),可以參考官網(wǎng)介紹;RAM/STS負(fù)責(zé)生成臨時上傳憑證;用戶應(yīng)用服務(wù)器,即提供該Android/iOS應(yīng)用的開發(fā)者開發(fā)的APP后臺服務(wù),管理APP上傳和下載的Token. 甚至是用戶在APP上傳數(shù)據(jù)元數(shù)據(jù)信息。數(shù)據(jù)流解析Android/iOS應(yīng)用不可能直接存儲Acce
3、ssKeyID/AccessKeySecret,這樣會存在泄密的風(fēng)險(xiǎn)。所以 應(yīng)用必須向用戶的應(yīng)用服務(wù)器申請一個臨時上傳憑證(注意下文將此臨時上傳憑證稱為Token),注意 這個Token是有時效性的,如這個Token的過期時間是30分鐘(這個時間可以由應(yīng)用服務(wù)器指定),那么在該Android/iOS應(yīng)用在這30分鐘里面,使用這個Token可以從OSS上傳和下載數(shù)據(jù), 30分鐘后再重新獲取。用戶的應(yīng)用服務(wù)器檢測上述請求的合法性,然后返回Token給應(yīng)用。手機(jī)拿到這個Token后就可以將數(shù)據(jù)上傳到OSS,或者從OSS下載數(shù)據(jù)了。本教程的目的就是,介紹下述紅色和藍(lán)色框的內(nèi)容應(yīng)用服務(wù)器如何生成這個To
4、ken,藍(lán)色方框效果本教程實(shí)現(xiàn)了一個APP,如下,大家可以掃描二維碼,安裝一下示例APP程序,這上工具是用Android開發(fā)。 但是本教程的應(yīng)用服務(wù)器搭建也適用于iOS, 即上述圖藍(lán)色的框的內(nèi)容。示例程序的體驗(yàn)示例程序的最終效果圖如下:應(yīng)用服務(wù)器:該移動應(yīng)用對應(yīng)的后臺應(yīng)用服務(wù)器。本教程搭建了一個后臺應(yīng)用服務(wù)器: HYPERLINK http:/oss-/ http:/oss- /app-server/sts.php上傳Bucket,指的是該移動應(yīng)用要把數(shù)據(jù)上傳到哪個Bucket 區(qū)域:指的第二步指定的Bucket對應(yīng)的區(qū)域。示例APP的使用可以點(diǎn)擊選擇圖片,然后就把文件上傳到OSS,上傳的方法
5、,支持普通上傳和斷點(diǎn)上傳。注意在一些網(wǎng)絡(luò)環(huán)境差的環(huán)境下,最 好用斷點(diǎn)上傳。然后可以利用圖片處理服務(wù),可以對將上傳的圖片進(jìn)行縮略和加水印處理。初始使用請暫時先不要改應(yīng)用服務(wù) 可以點(diǎn)擊選擇圖片,然后就把文件上傳到OSS,上傳的方法,支持普通上傳和斷點(diǎn)上傳。注意在一些網(wǎng)絡(luò)環(huán)境差的環(huán)境下,最 好用斷點(diǎn)上傳。然后可以利用圖片處理服務(wù),可以對將上傳的圖片進(jìn)行縮略和加水印處理。初始使用請暫時先不要改應(yīng)用服務(wù) 器地址和Bucket名字搭建這樣一個APP上傳和下載的系統(tǒng) ,需要準(zhǔn)備的東西:我必須開通了OSS,并且創(chuàng)建了Bucket,bucket:sdk-demo我必須開通STS服務(wù)。開通STS服務(wù)其實(shí)是為了如何
6、生成上述所描述的Token我必須搭建這樣一個應(yīng)用服務(wù)器。這在個事例里面,我搭建的應(yīng)用服務(wù)器的地址是: HYPERLINK http:/oss-/ http:/oss- /app-server/sts.php . 注意:這個例子本教程是采用PHP編寫的,但是事實(shí)上,用戶可以選擇自己喜歡的語言進(jìn)行編寫,如Java 、Python、 Go、Ruby、Node.js、C#等編寫。為帳號開通STS服務(wù)1. 如果已經(jīng)有bucket可以忽略這一步, 如果沒有bucket,創(chuàng)建Bucket參考官網(wǎng)1. 第二步操作,開通STS,可以參考 如下: (1)要開通STS服務(wù),首先OSS登陸官網(wǎng)控制臺(2)登錄管理控制
7、臺,點(diǎn)擊:安全令牌快捷配置RAM,會彈出開通的對話框。直接點(diǎn)開通,這個要求實(shí)名驗(yàn) (4)點(diǎn)擊開始授權(quán)后,系統(tǒng)會進(jìn)行自動授權(quán),請千萬保存如下圖框住的三個參數(shù)點(diǎn)擊保存AK信息后,對話框會關(guān)閉。保存好下面標(biāo)紅的結(jié)果3.保存這三個參數(shù)后。到這一步,STS的開通已經(jīng)完成了。 注意如果您之前已經(jīng)點(diǎn)擊這個頁面創(chuàng)建了AccessKeyId/AccessKeySecrte, 彈出的頁面如下:點(diǎn)擊如下圖所示的查看點(diǎn)擊如下圖所示的創(chuàng)建AccessKey記下如下參數(shù)1,2并記下如下參數(shù)3:保存這三個參數(shù)后。到這一步,STS的開通已經(jīng)完成了。講解一下應(yīng)用服務(wù)器的搭建。為了方便大家開發(fā)。 本教程準(zhǔn)備了三個語言的版本示例程
8、序 (Java、PHP、Ruby)應(yīng)用服務(wù)器代碼示例的下載PHP: 下載地址Java: 下載地址Ruby: 下載地址應(yīng)用服務(wù)器示例的配置AccessKeyID : , AccessKeySecret : , RoleArn : , TokenExpireTime : 900,AccessKeyID : , AccessKeySecret : , RoleArn : , TokenExpireTime : 900,PolicyFile: policy/all_policy.txt下面對配置進(jìn)行講解。AccessKeyID填寫上述圖標(biāo)紅的1的內(nèi)容,即用戶自己在全AccessKeySecret填寫上
9、述圖片標(biāo)紅2的內(nèi)容RoleArn3的內(nèi)容TokenExpireTime 指Android/iOS應(yīng)用取到這個Token的失效時間,注意,最少是900s, 默認(rèn)值可以不修改,PolicyFile: 填寫的是該該Token所要擁有的權(quán)限列表的文件, 默認(rèn)值可以不改 本教程準(zhǔn)備了三種最常用token 權(quán)限文件,放于policy目錄下面。分別是 all_policy.txt : 指定了該token擁有對該帳號下,創(chuàng)建Bucket、刪除Bucket、上傳文件、下載文件、刪除文件的權(quán)限 。 bucket_read_policy.txt : 指定了該token擁有該帳號下,對指定Bucket的權(quán)限。 buc
10、ket_read_write_policy.txt: 指定了該token擁有該帳號下,對指定Bucket的權(quán)限。如果你想要指定這個Token只能對指定的bucket有讀寫權(quán)限, 請把(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的狀態(tài),獲取成功時,返回值是200 AccessKeyId: 表示Android/iOS應(yīng)用初始化OSSClient獲取的 AccessKeyId AccessKeySecret: 表示Android/iOS應(yīng)用初始化OSSClient獲取AccessKeySecret
13、SecurityToken:表示Android/iOS應(yīng)用初始化的Token Expiration: 表示該Token失效的時間。主要在Android SDK會自動判斷是否失效,自動獲取Token 注意上述這四個變量將構(gòu)成了一個Token。代碼示例的運(yùn)行方法PHP運(yùn)行的,將包下載 后,然后修改好config.json這個文件。直接運(yùn)行php sts.php 即能生成Token,將程序部署到指定的地址。PHP運(yùn)行的,將包下載 后,然后修改好config.json這個文件。直接運(yùn)行php sts.php 即能生成Token,將程序部署到指定的地址。對于JAVA版本 (依賴于java 1.7)下載編
14、譯好的jar 包,下載地址: 下載后解壓:下載編譯好的jar 包,下載地址: 下載后解壓:運(yùn)行方法:java -jar oss-token-server.jar (port)如果不指定port(端口), 直接運(yùn)行java -jar oss-token-server.jar , 程序會監(jiān)聽7080端口如果想讓程序執(zhí)行在9000端口,運(yùn)行java -jar oss-token-server.jar 9000 , 其他端口也類似。體驗(yàn)自己的APP上傳應(yīng)用服務(wù)器::8080,選擇自己數(shù)據(jù)要上傳到哪個bcuket及區(qū)域,修改示例APP程序里面相應(yīng)Bucket及區(qū)域。點(diǎn)擊設(shè)置按鈕,將配置加載。選擇圖片,設(shè)
15、置上傳OSS文件名,上傳。然后就可以在Android上體驗(yàn)OSS服務(wù)了。這樣你就能通Android 示例程序?qū)?shù)據(jù)直接上傳到OSS了上傳成功后,可以看一下數(shù)據(jù)是否在OSS上了核心代碼解析-OSS初始化下面講解一下如何 利用Android/iOS SDK跟自己的應(yīng)用服務(wù)器,請求Token- Android版本/初始化一個OssService用來上傳下/初始化一個OssService用來上傳下publicOssServiceinitOSS(Stringendpoint,Stringbucket,UIDisplayerdisplayer) OSSCredentialProvidercredentia
16、lProvider;/使用自己的獲取STSToken的類/從應(yīng)用服務(wù)器控件里面讀取應(yīng)用服務(wù)器地址String stsServer = (EditText) findViewById(R.id.stsserver).getText().toString();/STSGetter類,封裝如何跟從應(yīng)用服務(wù)器取數(shù)據(jù),必須繼承于OSSFederationCredentialProvider這個類。 取Token這個取決于你所寫的APP跟應(yīng)用服務(wù)器數(shù)據(jù)的協(xié)議設(shè)計(jì)。/STSGetter類,封裝如何跟從應(yīng)用服務(wù)器取數(shù)據(jù),必須繼承于OSSFederationCredentialProvider這個類。 取Tok
17、en這個取決于你所寫的APP跟應(yīng)用服務(wù)器數(shù)據(jù)的協(xié)議設(shè)計(jì)。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); / 連接超時,默認(rèn)15秒conf.setSocketTimeout(15 * 1000); / socket超時,默認(rèn)15秒conf.setMaxConcurrentRequest(5); / 最大并發(fā)請求書,默認(rèn)5個conf.setMaxErrorRetry(2); / 失敗后最大重試次數(shù),默認(rèn)2次OSSoss=newOSSClient(getApplicationContext(),endpoint,credentialProvider,conf); return new OssService(oss, bucket,displ
19、ayer);- iOS版本/ 初始化一個OSSClient實(shí)例/ 初始化一個OSSClient實(shí)例- (void)ossInit / 構(gòu)造一個獲取STSToken的憑證提供器idcredential=OSSFederationCredentialProvideralloc initWithFederationTokenGetter:OSSFederationToken */ 實(shí)現(xiàn)一個函數(shù),同步返回從server獲取到的STSToken return self getFederationToken;/ 用endpoint、憑證提供器初始化一個OSSClientclient = OSSClient
20、 alloc initWithEndpoint:endPoint credentialProvider:credential;核心代碼解析-移動應(yīng)用從應(yīng)用服務(wù)器取Token具體APP從就應(yīng)用服務(wù)器取Token方法,必須寫到public OSSFederationToken getFederationToken() 這return new OSSFederationToken(aksktokenexpiration)ak, sktokenexpiration在本例子里,示例如下,注意用戶可以自定義自己的移動應(yīng)用跟自己應(yīng)用服務(wù)器之前的協(xié)議。- 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;/ 實(shí)現(xiàn)這個回調(diào)需要同步返回Token,所以要waitUntilFinished tcs.task waitUntilFinished;if (tcs.task.error) / 如果網(wǎng)絡(luò)請求出錯,返回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相關(guān)功能的代碼,可以查看示例程序的實(shí)現(xiàn)該Android示例程序的源碼下載地址該iOS示例程序的源碼下載地址應(yīng)用服務(wù)器代碼示例的下載PHP: 下載地址Java: 下載地址Ruby: 下載地址node.js: 下載地址搭建應(yīng)用服務(wù)器之STS Policy上一篇文章中介紹了如何快速搭建應(yīng)用服務(wù)器,在本文中會基于上文提到的應(yīng)用服務(wù)器,以上海的Bucket app-base-oss為例子,配置不同的Policy以實(shí)現(xiàn)不同的權(quán)限控制。 以下說明中假設(shè)你已經(jīng)開通了STS,并完全閱
29、讀了上一篇文章。以下提到的Policy都是上文提到的config.json中指定的Policy文件的內(nèi)容。 以下講述的獲取STS Token 后對OSS操作指的是應(yīng)用服務(wù)器指定Policy,從STS獲取臨時憑證后,應(yīng)用通過臨時憑證訪問OSS。常見Policy完全授權(quán)的PolicyStatement: 上文為了演示方便,默認(rèn)Policy如下,表示的意思是允許應(yīng)用對所有OSS的操作。這對移動應(yīng)用來說也是不安 全的授權(quán),不推薦Statement: Action: oss:*,Effect: Allow, Resource: acs:oss:*:*:*,Version: 1獲取STS Token 后對
30、OSS操作結(jié)果列出所有創(chuàng)建的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表示,應(yīng)用可以對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操作結(jié)果列出所有創(chuàng)建的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表示,應(yīng)用可以對Bucket app-base-oss下帶有前綴user1/的Object可列舉,可下載。但無法下載其他前綴的Object。 這樣不同的應(yīng)用如果對應(yīng)不同的前綴,就可以達(dá)到在同一個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操作結(jié)果列出所有創(chuàng)建的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操作結(jié)果列出所有創(chuàng)建的Bucket失敗上傳不帶前綴的Object,test.txt成功下載不帶前綴的Object, test.txt失敗上傳帶前綴的Object, user1/test.txt成功下載帶前綴的Object, user1/test.txt失敗列出Object, test.txt失敗帶前綴的Object, user1/test.txt失敗限制前綴的只寫不讀Policy這個Policy表示,應(yīng)用可以對Bucket app-base-oss下帶有前綴user1/的Object可上傳。但無法上傳其他前綴的Object。
35、 這樣不同的應(yīng)用如果對應(yīng)不同的前綴,就可以達(dá)到在同一個bucket中空間隔離的效果。Statement: Action: oss:PutObject,Effect: Allow,Resource: acs:oss:*:*:app-base-oss/user1/*, acs:oss:*:*:app-base-oss,Version: 1獲取STS Token 后對OSS操作結(jié)果列出所有創(chuàng)建的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表示,應(yīng)用可以對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操作結(jié)果列出所有創(chuàng)建的Bucket失敗上傳不帶前綴的Object,test.txt成功下載不帶前綴的Object, test.txt成功上傳帶前綴的Object, user1/test.txt成功下載帶前綴的Object, user1/test.txt成功列出Object, test.txt成功帶前綴的Object, user1/test.txt成功限制前綴的讀寫Policy這個Policy表示,應(yīng)用可以對Bucket app-base-oss下帶有前綴
38、user1/的Object可列舉,可下載,可上傳和刪除。但無法對其他前綴的Object進(jìn)行讀寫。 這樣不同的應(yīng)用如果對應(yīng)不同的前綴,就可以達(dá)到在同一個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操作結(jié)果列出所有創(chuàng)建的Bucket失敗上傳不帶前綴的Object,test.txt失敗下載不帶前綴的Object, test.txt失敗上傳帶前綴的Object, user1/test.txt成功下載帶前綴的Object, user1/test.txt成功列出Object, test.txt成功帶前綴的Object, user1/test.txt成功小結(jié)從上面的例子可以看出可以根據(jù)不同的應(yīng)用場景制定不同的Policy,然后對應(yīng)用服務(wù)器稍作修改就可以實(shí)現(xiàn)對不用的應(yīng)用用 戶實(shí)現(xiàn)不同的權(quán)限控制。另外也可以在應(yīng)用端做優(yōu)化,在STSToken過期之前不需要向
40、應(yīng)用服務(wù)器再次請求。這里就不多講。需要特別注意的是Token實(shí)際頒發(fā)是由STS頒發(fā)的,應(yīng)用服務(wù)器相當(dāng)于定制了Policy,向STS請求Token,然后將TokenToken是一個簡略的說法。實(shí)際上包含了這些在OSS提供給應(yīng)用的SDK中 SDK的實(shí)現(xiàn)。更多參考資料RAM和STS在OSS中的使用指南RAM官方文檔和STS官方文檔30分鐘快速搭建移動應(yīng)用上傳回調(diào)服務(wù)背景上一篇文章我們介紹了如何快速搭建移動應(yīng)用 參考移動端開發(fā)場景流程圖 點(diǎn)擊查看上述圖中Android/iOS移動應(yīng)用的職責(zé)會負(fù)責(zé)申請STS憑證,然后使用從應(yīng)用服務(wù)器取的憑證上傳上述圖中應(yīng)用服務(wù)器的職責(zé)負(fù)責(zé)給Android/iOS移動應(yīng)用
41、,生成STS憑證上述圖中OSS的職責(zé)OSS負(fù)責(zé)處理移動應(yīng)用的數(shù)據(jù)請求問題對于Android/iOS移動應(yīng)來說,移動應(yīng)用只需要執(zhí)行操作1(申請STS憑證),就能調(diào)用多次5(使用該STS憑證 上傳數(shù)據(jù)到OSS)。這樣就導(dǎo)致了應(yīng)用服務(wù)器根本不知道用戶都上傳了哪些數(shù)據(jù) ,如果那么作為該APP的開發(fā)者,就沒法對應(yīng)用上傳數(shù)據(jù)進(jìn)行管理。所以,有什么問題能讓應(yīng)用服務(wù)器感知到Android/iOS移動應(yīng)用上傳的數(shù) 據(jù)呢?答案通過使用OSS的上傳回調(diào)服務(wù),就能解決上述問題,如下圖:即OSS在收到Android/iOS移動的數(shù)據(jù)(第5步)和在返回用戶上傳結(jié)果(第6步)之間,觸發(fā)一個上傳回調(diào)工作。即第5.5步。先回調(diào)
42、用戶服務(wù)器,然后得到應(yīng)用服務(wù)器返回的內(nèi)容,將這個內(nèi)容返回給Android/iOS移動應(yīng)用。可以參考一下Callback API文檔上傳回調(diào)的作用通過上傳回調(diào)可以讓用戶應(yīng)用服務(wù)器知道當(dāng)前上傳文件的基本信息基本信息如下表:系統(tǒng)變量含義bucket移動應(yīng)用上傳到哪個存儲空間object移動應(yīng)用上傳到OSS保存的文件名etag該上傳的文件的etag,即返回給用戶的etag字段size該上傳的文件的大小mimeType資源類型imageInfo.height圖片高度imageInfo.width圖片寬度imageInfo.format圖片格式,如jpg、png,只以識別圖片返回上述變量的一個或者多個,返
43、回內(nèi)容格式形式在Android/iOS上傳時指定通過上傳回調(diào)設(shè)定自定義參數(shù),達(dá)到信息傳遞目的如:假如我是一個開發(fā)者,我想知道當(dāng)前用戶所使用的APP版本、當(dāng)前用戶所在的操作系統(tǒng)版本、用戶的GPS信息、用戶的手機(jī)型號。那么我可以在Android/iOS端上傳文件時,指定上述自定義參數(shù) ,如x:version指定APP版本,x:system指定操作系統(tǒng)版本,x:gps指定GPS信息,x:phoneOSS時,附帶上。然后OSS,會把這些值,放到CallbackBody里面,一起發(fā)給應(yīng) 用服務(wù)器。這樣應(yīng)用服務(wù)器就能收到這些信息,達(dá)到信息傳遞的目的。移動應(yīng)用端怎么樣設(shè)定上傳回調(diào)?要讓OSS在接收上傳請求時
44、,觸發(fā)上傳回調(diào),那么移動應(yīng)用必須在構(gòu)造上傳請求,必須把要兩個內(nèi)容指定到上 傳請求里面。這兩個內(nèi)容如下:如上一點(diǎn)提到的 HYPERLINK /callback.php /callback.php,注意這個地址必須 是公網(wǎng)能夠訪問的上傳回調(diào)給應(yīng)用服務(wù)器的內(nèi)容callbackBody。可以是上述OSS返回應(yīng)用服務(wù)器系統(tǒng)變量的一個或者 多個。舉一個示例。假如我的用戶服務(wù)器上傳回調(diào)地址是: HYPERLINK /callback.php /callback.php。我想獲取手機(jī)上傳的文件名字,文件的大小,并且我定義了photo變量是指手機(jī)型號。system是操作系統(tǒng)版本OSSPutObjectReque
45、st*OSSPutObjectRequest*request=OSSPutObjectRequestnew; request.bucketName =;request.objectKey = ;request.uploadingFileURL = NSURL fileURLWithPath:;/ 設(shè)置回調(diào)參數(shù)request.callbackParam = callbackUrl: HYPERLINK /callback.php /callback.php,callbackBody: filename=$object&size=$size&photo=$x:photo&system=$x:sys
46、tem;/ 設(shè)置自定義變量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););對于上傳回調(diào),應(yīng)用服務(wù)器應(yīng)該做些什么?你必須要有部署一個可以接收POST請求的服務(wù),這個服務(wù)必須有公網(wǎng)地址如 HYPERLINK /callback.php 或者外網(wǎng)IP也可以),不然OSS沒有辦法訪問到這個地址。你要給OSS正確的返回,返回格式必須是JSON格式,內(nèi)容自定義。因?yàn)镺SS會把應(yīng)用服務(wù)器返回的 內(nèi)容,原封
49、不動地返回給Android/iOS移動應(yīng)用。(切記,返回給OSS的Response Header一定要加上Content-Length這個頭部)本教程在后續(xù)內(nèi)容,為大家準(zhǔn)備了多個語言版本的示例, 下載及運(yùn)行方法在本教程的最后。應(yīng)用服務(wù)器收到的回調(diào)請求是怎么樣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文檔應(yīng)用服務(wù)器怎么樣判斷這個請求是來自O(shè)SS之所以要判斷這個請求是來自O(shè)SS,是因?yàn)槿绻愕幕卣{(diào)服務(wù)器被人惡意攻擊了,別人惡意回調(diào)你的應(yīng)用服務(wù) 器,導(dǎo)致應(yīng)用服務(wù)器收到一些非法的請求,影響正常邏輯。 判斷的方法主要是利用OSS給應(yīng)用服務(wù)器返回的頭部內(nèi)容中, x-oss-pub-key-url,authorization這兩個參數(shù)進(jìn)行RSA校驗(yàn)。只有通過RSA校驗(yàn)的請求,才能說明這個請求是來自O(shè)SS,本教程提供的示例程序都有實(shí)現(xiàn)的示例,大家可以參考。應(yīng)用服務(wù)器收到這個回調(diào)做什么f
52、ilename=test.txt&size=5&photo=iphone6s&system=ios9.1應(yīng)用服務(wù)器在校驗(yàn)這個請求是來自O(shè)SS后(這一步不是必要的),因?yàn)锳ndroid/iOS應(yīng)用在上傳數(shù)據(jù)時,指定 了回調(diào)給應(yīng)用服務(wù)器的內(nèi)容格式,如filename=test.txt&size=5&photo=iphone6s&system=ios9.1應(yīng)用服務(wù)器就可以根據(jù)OSS的返回內(nèi)容,解析得到自己想要得到的數(shù)據(jù)。得到這個數(shù)據(jù)后,應(yīng)用服務(wù)器可以把 數(shù)據(jù)存放起來,方便后續(xù)管理。應(yīng)用服務(wù)器收到這個回調(diào)要怎么樣返回給OSS返回狀態(tài)碼是200;返回必須是json格式的內(nèi)容;并且返回的頭部必須帶有Con
53、tent-Length這個頭部OSS怎么樣處理應(yīng)用服務(wù)器的返回內(nèi)容有兩種情況:,OSS會返回給Android/iOS移動應(yīng)用203的狀態(tài)碼,但是數(shù)據(jù)已經(jīng)存放到OSS上了。應(yīng)用服務(wù)器,接收到OSS的回調(diào)請求,并且正確返回了,OSS會返回給Android/iOS移動應(yīng)用狀態(tài)碼 是200,OSS的內(nèi)容,原封不動地返回給Android/iOS移動應(yīng)用.上傳回調(diào)服務(wù)器示例程序下載示例程序只是完成了如何檢查應(yīng)用服務(wù)器收到的簽名, 用戶要自行增加對應(yīng)用服務(wù)器收到回調(diào)的內(nèi)容的格式解析 。 Java版本:下載地址:點(diǎn)擊這里運(yùn)行方法,解壓包運(yùn)行java -jar oss-callback-server-demo.
54、jar 9000(9000就運(yùn)行的端口,可以自己指定)注意這個jar例子在java 1.7運(yùn)行通過,如果有問題可以自己依據(jù)提供的代碼進(jìn)行修改。這是一個maven項(xiàng)目PHP版本:下載地址:點(diǎn)擊這里運(yùn)行方法:部署到Apache環(huán)境下,因?yàn)镻HP本身語言的特點(diǎn),取一些數(shù)據(jù)頭部會依賴于環(huán)境。所以 可以參考例子基于自己所在環(huán)境進(jìn)行修改Python版本:下載地址:點(diǎn)擊這里運(yùn)行方法:解壓包直接運(yùn)行python callback_app_server.py即可,程序自實(shí)現(xiàn)了一個簡單的http server,運(yùn)行該程序可能需要安裝rsa的依賴。Ruby版本:下載地址:點(diǎn)擊這里rubyaliyun_oss_cal
55、lback_server.rbWeb端直傳實(shí)踐目的本教程的目錄是通過三個例子介紹如何在Html表單提交直傳OSS第一個例子:講解簽名在客戶端(Javascript)完成,然后直接通過表單上傳到OSS, 注意這個例子有安全風(fēng)險(xiǎn),推薦使用第二個例子和第三個例子第二個例子:講解簽名在服務(wù)端(php)完成,然后直接通過表單上傳到OSS第三個例子:講解簽名在服務(wù)端(php)完成, 并且服務(wù)端面設(shè)置了上傳后回調(diào)。然后直接通過表單上傳到OSS,OSS回調(diào)完應(yīng)用服務(wù)器再返回給用戶。背景每個用OSS的用戶,都會用到上傳。由于是網(wǎng)頁上傳,其中包括一些APP里面的h5頁面,對上傳的需求很強(qiáng)烈,很多人采用的做法是用戶
56、在瀏覽器/APP上傳到應(yīng)用服務(wù)器,然后應(yīng)用服務(wù)器再把文件上傳到OSS。這種方法有三個缺點(diǎn):第一:上傳慢,先上傳到應(yīng)用服務(wù)器,再上傳到OSS,網(wǎng)絡(luò)傳送多了一倍,而且OSS是采用BGP帶寬,能保證各地各運(yùn)營商的速度。第二:擴(kuò)展性不好,如果后續(xù)用戶多了,應(yīng)用服務(wù)器會成為瓶頸。第三:費(fèi)用高,因?yàn)镺SS上傳流量是免費(fèi)的。如果數(shù)據(jù)直傳到OSS,不走應(yīng)用服務(wù)器。那么將能省下 幾臺應(yīng)用服務(wù)器?;A(chǔ)篇:客戶端用JS直接簽名,然后上傳到OSS點(diǎn)擊這里打開示例進(jìn)階篇:應(yīng)用服務(wù)器php返回簽名點(diǎn)擊這里打開示例終級篇-應(yīng)用服務(wù)器php返回簽名及采用上傳回調(diào)點(diǎn)擊這里打開示例PC_Web直傳實(shí)踐Web端直傳實(shí)踐-JS客戶端
57、簽名直接上傳背景可以參考:點(diǎn)擊這里打開背景介紹基礎(chǔ)篇:客戶端用JS直接簽名,然后上傳到OSS示例下面我將介紹用plupload ,在JS端簽名然后直傳數(shù)據(jù)到OSS的例子 用戶電腦瀏覽器測試樣例:點(diǎn)擊這里打開示例用手機(jī)測試該上傳是否有效。二維碼:可以用手機(jī)(微信,QQ,手機(jī)瀏覽器等)掃一掃試試(這個不是廣告,只是上述網(wǎng)址的二維碼。這為了讓大家看一下這個實(shí)現(xiàn)能在手機(jī)端完美運(yùn)行。)文件上傳是上傳到一個測試的公共 bucket , 會定時清理,所以不要傳一些敏感及重要數(shù)據(jù)。代碼下載點(diǎn)擊這里:oss-h5-upload-js-direct.zip原理本例子的功能采用pluploadPostObject)
58、到OSS支持html5,flash,silverlight,html4可以運(yùn)行在PC瀏覽器,手機(jī)瀏覽器,微信等可以選擇多文件上傳顯示上傳進(jìn)度條可以控制上傳文件的大小可以設(shè)置上傳到指定目錄和設(shè)置上傳文件名字是隨機(jī)文件名還是本地文件名;OSS的PostObject API細(xì)節(jié)可以參照這里。pluploadplupload是一款簡單易用且功能強(qiáng)大, 擁有多種上傳方式,(html5, flash, silverlight, html4)等方式,會智能檢測當(dāng)前環(huán)境 選擇最適合的方式,并且會優(yōu)先采用Html5, 所以不用花心思去當(dāng)前的瀏覽器要用何種方式上傳,plupload會幫您考慮好。關(guān)鍵代碼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, /讓服務(wù)端返回200,不然,默認(rèn)會返回204 signature: signature,在這里有一點(diǎn)可以注意一下。就是Fi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國甲苯二異氰酸酯行業(yè)產(chǎn)能預(yù)測及投資可行性研究報(bào)告版
- 2024-2030年中國甘露糖行業(yè)發(fā)展現(xiàn)狀與前景動態(tài)預(yù)測報(bào)告
- 2024-2030年中國牙科激光治療儀行業(yè)技術(shù)創(chuàng)新模式分析及發(fā)展策略研究報(bào)告
- 2024-2030年中國煤膠油項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國煤制丙烯行業(yè)發(fā)展可行性及投資規(guī)劃分析報(bào)告版
- 2024-2030年中國熱計(jì)量改造行業(yè)運(yùn)營模式及未來發(fā)展策略分析報(bào)告
- 2024年機(jī)器視覺產(chǎn)業(yè)項(xiàng)目申請報(bào)告模板
- 2024-2030年中國海水養(yǎng)殖海蜇行業(yè)運(yùn)營狀況及發(fā)展趨勢預(yù)測報(bào)告
- 2024-2030年中國汽車維修行業(yè)經(jīng)營模式及發(fā)展規(guī)劃分析報(bào)告版
- 2024-2030年中國汽車改裝行業(yè)發(fā)展創(chuàng)新模式及投資戰(zhàn)略研究報(bào)告
- 肺脹病(中醫(yī)臨床路徑
- 鋼結(jié)構(gòu)防塵網(wǎng)施工方案
- “一戶一表”改造工程施工組織方案
- 大型及分布式光伏電站視頻監(jiān)控典型配置方案V1.0
- 《十字繡》教學(xué)設(shè)計(jì)及反思
- 橋梁形象進(jìn)度圖
- C站使用說明JRC
- 習(xí)作:推薦一個好地方 推薦ppt課件
- 角的度量 華應(yīng)龍(課堂PPT)
- 公路銑刨機(jī)整機(jī)的設(shè)計(jì)含全套CAD圖紙
- 機(jī)器人學(xué)課程教學(xué)大綱
評論
0/150
提交評論