30分鐘快速搭建移動應用直傳OSS服務

30分鐘快速搭建移動應用直傳服務

背景

這是一個移動互聯的時代。手機APP上傳的數據會越來越多。把數據存儲的問題交給OSS, 讓開發者能更加專注于自己的應用邏輯。
那么怎么樣基于OSS構建一個APP存儲系統呢?

目的

本教程就是讓你在30分鐘內搭建一個基于OSS的移動應用數據直傳服務,所謂直傳就是移動應用的數據的上傳和下載直接直連OSS,只有控制流走用戶自己的服務器。

  1. 安全的上傳下載方式(臨時,靈活的賦權鑒權),
  2. 成本低(這樣用戶不需要準備很多服務器,因為移動應用直聯云存儲,只有控制流走用戶自己的應用服務器。)
  3. 高并發,支持海量用戶(OSS有海量的上傳和下載帶寬)
  4. 彈性(OSS有無限擴容的存儲空間)
  5. 方便(可以方便的對接到媒體轉碼服務-視頻多端適配,圖片處理服務,CDN加速下載等)

架構圖

本教程就是讓你在30分鐘內搭建一個基于OSS的移動應用數據直傳服務

images%2Fapp1.png@700w_80Q.jpg

詳細可以參考這里

角色解析

  1. Android/iOS 應用。即最終用戶手機上的APP;
  2. OSS,即阿里云對象存儲,負責存儲APP上傳的數據,可以參考官網http://www.aliyun.com/product/oss;
  3. RAM/STS負責生成臨時上傳憑證
  4. 用戶應用服務器,即提供該Android/iOS應用的開發者開發的APP后臺服務,管理APP上傳和下載的Token. 甚至是用戶在APP上傳數據元數據信息。

數據流解析

  1. Android/iOS應用不可能直接存儲AccessKeyID/AccessKeySecret,這樣會存在泄密的風險。所以應用必須向用戶的應用服務器申請一個臨時上傳憑證(注意下文將此臨時上傳憑證稱為Token),注意這個Token是有時效性的,如這個Token的過期時間是30分鐘(這個時間可以由應用服務器指定),那么在該Android/iOS應用在這30分鐘里面,使用這個Token可以從OSS上傳和下載數據, 30分鐘后再重新獲取。
  2. 用戶的應用服務器檢測上述請求的合法性,然后返回Token給應用。
  3. 手機拿到這個Token后就可以將數據上傳到OSS,或者從OSS下載數據了。

本教程的目的就是,介紹下述紅色和藍色框的內容

app2.png@700w_80Q.jpg

  1. 應用服務器如何生成這個Token,藍色方框
  2. Android/iOS應用如何取Token,紅色方框

效果

本教程實現了一個APP,如下,大家可以掃描二維碼,安裝一下示例APP程序,這上工具是用Android開發。 但是本教程的應用服務器搭建也適用于iOS, 即上述圖藍色的框的內容。

images%2Fandroid-apk-qrcode.png

示例程序的體驗

示例程序的最終效果圖如下:

  1. 應用服務器:該移動應用對應的后臺應用服務器。本教程搭建了一個后臺應用服務器:http://oss-demo.aliyuncs.com/app-server/sts.php

  2. 上傳Bucket,指的是該移動應用要把數據上傳到哪個Bucket

  3. 區域:指的第二步指定的Bucket對應的區域。

示例APP的使用

可以點擊選擇圖片,然后就把文件上傳到OSS,上傳的方法,支持普通上傳和斷點上傳。注意在一些網絡環境差的環境下,最好用斷點上傳。然后可以利用圖片處理服務,可以對將上傳的圖片進行縮略和加水印處理。初始使用請暫時先不要改應用服務器地址和Bucket名字

搭建這樣一個APP上傳和下載的系統 ,需要準備的東西:

  1. 我必須開通了OSS,并且創建了Bucket, 在這個例子里面的,對應的bucket是 :sdk-demo
  2. 我必須開通STS服務。開通STS服務其實是為了如何生成上述所描述的Token
  3. 我必須搭建這樣一個應用服務器。這在個事例里面,我搭建的應用服務器的地址是:http://oss-demo.aliyuncs.com/app-server/sts.php .
    注意這個例子本教程是采用PHP編寫的,但是事實上,用戶可以選擇自己喜歡的語言進行編寫,如Java 、Python、 Go、Ruby、Node.js、C#等編寫

為帳號開通STS服務

  1. 如果已經有bucket可以忽略這一步, 如果沒有bucket,創建Bucket參考官網

  2. 第二步操作,開通STS,可以參考 如下:
    (1)要開通STS服務,首先OSS登陸官網控制臺

(2)登錄管理控制臺,點擊:安全令牌快捷配置

(3)會進入到令牌快捷配置頁面,注意如果沒有開通RAM,會彈出開通的對話框。直接點開通,這個要求實名驗證。 做完后跳到本頁面。點擊開始授權

images%2Fsts2.png@600w_80Q.jpg

(4)點擊開始授權后,系統會進行自動授權,請千萬保存如下圖框住的三個參數

點擊保存AK信息后,對話框會關閉。保存好下面標紅的結果3.

保存這三個參數后。到這一步,STS的開通已經完成了。
注意如果您之前已經點擊這個頁面創建了AccessKeyId/AccessKeySecrte, 彈出的頁面如下:

點擊如下圖所示的查看

點擊如下圖所示的創建AccessKey

記下如下參數1,2

并記下如下參數3:

保存這三個參數后。到這一步,STS的開通已經完成了。

講解一下應用服務器的搭建。

為了方便大家開發。 本教程準備了三個語言的版本示例程序 (Java、PHP、Ruby)

應用服務器代碼示例的下載

PHP: 下載地址

Java: 下載地址

Ruby: 下載地址

應用服務器示例的配置

每個語言包下載下來后,都會有一個配置文件config.json
如下例:

{
"AccessKeyID" : "",
"AccessKeySecret" : "",
"RoleArn" : "",
"TokenExpireTime" : "900",
"PolicyFile": "policy/all_policy.txt"
}

下面對配置進行講解。

  1. AccessKeyID填寫上述圖標紅的1的內容,即用戶自己在全
  2. AccessKeySecret填寫上述圖片標紅2的內容
  3. RoleArn 填寫上述圖標紅3的內容
  4. TokenExpireTime 指Android/iOS應用取到這個Token的失效時間,注意,最少是900s, 默認值可以不修改,
  5. PolicyFile: 填寫的是該該Token所要擁有的權限列表的文件, 默認值可以不改
    本教程準備了三種最常用token 權限文件,放于policy目錄下面。分別是
    all_policy.txt : 指定了該token擁有對該帳號下,創建Bucket、刪除Bucket、上傳文件、下載文件、刪除文件的權限 。
    bucket_read_policy.txt : 指定了該token擁有該帳號下,對指定Bucket的權限。
    bucket_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","AccessKeySecret":"rpnwO9kvEgetGdrddgsR2YrTtI","Security":"CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s˙?˙?3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVtbzI=","Expiration":"2015-12-12T07:49:09Z",
}

status:表示獲取Token的狀態,獲取成功時,返回值是200
AccessKeyId: 表示Android/iOS應用初始化OSSClient獲取的 AccessKeyId
AccessKeySecret: 表示Android/iOS應用初始化OSSClient獲取AccessKeySecret
SecurityToken:表示Android/iOS應用初始化的Token
Expiration: 表示該Token失效的時間。主要在Android SDK會自動判斷是否失效,自動獲取Token
注意上述這四個變量將構成了一個Token。

代碼示例的運行方法

對于PHP版本

PHP運行的,將包下載 后,然后修改好config.json這個文件。直接運行php sts.php 即能生成Token,將程序部署到指定的地址。

對于JAVA版本 (依賴于java 1.7)

下載編譯好的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上傳應用服務器


1. 把把程序部署起來后,記下應用服務器地址如 :http://abc.com:8080, 將示例程序里面的應用服務器修改成上述地址2. 選擇自己數據要上傳到哪個bcuket及區域,修改示例APP程序里面相應Bucket及區域。3. 點擊設置按鈕,將配置加載。4. 選擇圖片,設置上傳OSS文件名,上傳。然后就可以在Android上體驗OSS服務了。這樣你就能通Android 示例程序將數據直接上傳到OSS了 5. 上傳成功后,可以看一下數據是否在OSS上了

核心代碼解析-OSS初始化

下面講解一下如何 利用Android/iOS SDK跟自己的應用服務器,請求Token

  • Android版本
//初始化一個OssService用來上傳下
public OssService initOSS(String endpoint, String bucket, UIDisplayer displayer) {OSSCredentialProvider credentialProvider;//使用自己的獲取STSToken的類
//從應用服務器控件里面讀取應用服務器地址String stsServer = ((EditText) findViewById(R.id.stsserver)).getText().toString();//STSGetter類,封裝如何跟從應用服務器取數據,必須繼承于OSSFederationCredentialProvider這個類。 取Token這個取決于你所寫的APP跟應用服務器數據的協議設計。if (stsServer .equals("")) {credentialProvider = new STSGetter();}else {credentialProvider = new STSGetter(stsServer);}
//獲取控件上的bucket名字bucket = ((EditText) findViewById(R.id.bucketname)).getText().toString();//初始化OSSClient ClientConfiguration conf = new ClientConfiguration();conf.setConnectionTimeout(15 * 1000); // 連接超時,默認15秒conf.setSocketTimeout(15 * 1000); // socket超時,默認15秒conf.setMaxConcurrentRequest(5); // 最大并發請求書,默認5個conf.setMaxErrorRetry(2); // 失敗后最大重試次數,默認2次OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);return new OssService(oss, bucket, displayer);
}
  • iOS版本

// 初始化一個OSSClient實例
- (void)ossInit {// 構造一個獲取STSToken的憑證提供器id<OSSCredentialProvider> credential = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * {// 實現一個函數,同步返回從server獲取到的STSTokenreturn [self getFederationToken];}];// 用endpoint、憑證提供器初始化一個OSSClientclient = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];
}

核心代碼解析-移動應用從應用服務器取Token

具體APP從就應用服務器取Token方法,必須寫到public OSSFederationToken getFederationToken() { } 這個函數里面。
注意這個函數的邏輯依賴于可以自己設定,但是最終結果必須返回這樣一個變量 return new OSSFederationToken(ak, sk, token, expiration);
其中ak, sk, token, expiration 必須是從應用服務器返回的Body獲取的。

在本例子里,示例如下,注意用戶可以自定義自己的移動應用跟自己應用服務器之前的協議。

  • Android版本
public OSSFederationToken getFederationToken() {String stsJson;OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(stsServer).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {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.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 = [NSURL URLWithString:STSServer];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource];
NSURLSession * session = [NSURLSession sharedSession];
NSURLSessionTask * sessionTask = [session 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。該次請求OSS會失敗。return nil;
} else {// 從網絡請求返回的內容中解析JSON串拿到Token的各個字段,組成STSToken返回NSDictionary * object = [NSJSONSerialization JSONObjectWithData:tcs.task.resultoptions:kNilOptionserror:nil];OSSFederationToken * token = [OSSFederationToken new];nitoken.tAccessKey = [object objectForKey:@"AccessKeyId"];token.tSecretKey = [object objectForKey:@"AccessKeySecret"];token.tToken = [object objectForKey:@"SecurityToken"];token.expirationTimeInGMTFormat = [object objectForKey:@"Expiration"];return token;
}

OSS相關功能的代碼,可以查看示例程序的實現

該Android示例程序的源碼下載地址

該iOS示例程序的源碼下載地址

應用服務器代碼示例的下載

PHP: 下載地址

Java: 下載地址

Ruby: 下載地址

轉載于:https://www.cnblogs.com/ossteam/p/5059571.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397057.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用java判斷一個年份是否為閏年_判斷閏年還是平年

↑↑↑點擊上方圖片&#xff0c;了解詳情正文&#xff1a;判斷一個年份是閏年還是平年。閏年條件&#xff1a;1.可以被400整除。2.可以被4整除&#xff0c;但是不可以被100整除。代碼&#xff1a;Private Sub 查詢_Click() If Me.年份 Mod 4 0 And Me.年份 Mod 100 <> 0…

PAT L1-048 矩陣A乘以B

https://pintia.cn/problem-sets/994805046380707840/problems/994805082313310208 給定兩個矩陣A和B&#xff0c;要求你計算它們的乘積矩陣AB。需要注意的是&#xff0c;只有規模匹配的矩陣才可以相乘。即若A有R?a??行、C?a??列&#xff0c;B有R?b??行、C?b??列&a…

【JavaScript吉光片羽】--- 滑動條

燈光的亮度控制需要一個滑動條&#xff0c;先借用lamp源碼中Bar&#xff1a; var Bar function (opt) {var defaults {$id: "", // 進度條dom節點idmin: 1, // 刻度最小值stepCount: 5, // 刻度步數step: 1, // 刻度步長$alpha: "",//顯示亮度的idtouchE…

ldd /usr/bin/mysql_mysql客戶端登錄時報mysql: relocation error錯誤

在安裝了xtrabackup后&#xff0c;再用下列命令登錄時報下列錯誤[rootlocalhost ~]# mysql -u root -pmysql: relocation error: mysql: symbol strmov, version libmysqlclient_16 not defined in file libmysqlclient.so.16 with link time reference解決方法&#xff1a;查看…

python語言用什么關鍵字來聲明一個類_python使用什么關鍵字定義類

什么是類&#xff1f; 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。 什么是方法&#xff1f; 類中的函數即為方法 如何定義一個類&#xff1f; 定義類&#xff0c;語法格式如下&#xff1a;class ClassName:. . .…

谷歌+安卓,他已經改變了世界兩次,但還想多來幾次

回望拉里佩奇的創業經歷&#xff0c;小巴發現他在幾個創業者最有可能犯&#xff08;si&#xff09;錯&#xff08;bi&#xff09;的節點上都處理得很好。 你還記得你用的第一個搜索網站是什么嗎&#xff1f; Google.com 講到它的創始人&#xff0c;一般要連起來念&#xff0c; …

centos7 DNS服務器搭建

DNS&#xff0c;全稱Domain Name System&#xff0c;即域名解析系統。 DNS幫助用戶在互聯網上尋找路徑。在互聯網上的每一個計算機都擁有一個唯一的地址&#xff0c;稱作“IP地址”&#xff08;即互聯網協議地址&#xff09;。由于IP地址&#xff08;為一串數字&#xff09;不方…

lisp中怎樣調取圖形_CAD的lisp程序已加載,怎樣繪圖?

回答&#xff1a;1.計算所有線段總長度(加載后只需框選所有線段便可得出這些線段的總長度)(defun c:LL ()(setvar "cmdecho" 1)(setq en (ssget(list (0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0)(setq ll 0)(repeat (sslength en)(setq ss (…

Java Web的web.xml文件作用及基本配置(轉)

其實web.xml就是asp.net的web.config一個道理。 說明&#xff1a; 一個web中完全可以沒有web.xml文件&#xff0c;也就是說&#xff0c;web.xml文件并不是web工程必須的。 web.xml文件是用來配置&#xff1a;歡迎頁、servlet、filter等的。當你的web工程沒用到這些時&#xff0…

stand up meeting 12/21/2015

part組員 工作 工作耗時/h明日計劃工作耗時/h UI馮曉云 完成PDF UI主頁面的頁面切換功能&#xff0c;待完善 4 完善頁面切換&#xff0c;修補彈窗bug 4foxit PDF Reader朱玉影 修改了對pdf中文本進行搜索的代碼&#xff0c;使其更加robust 4 pdf…

python快速檢測視頻跳過幀_使用Python實現跳幀截取視頻幀

本文實例為大家分享了Python跳幀截取視頻幀的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 可以自由設定時長來截取視頻&#xff0c;經實測效果理想。期間遇到的一個麻煩是我的視頻文件在D:盤&#xff0c;在原視頻D盤目錄上不能保存截取的圖片文件&#xff0c;后改…

BZOJ3999: [TJOI2015]旅游

BZOJ3999: [TJOI2015]旅游 Description 為了提高智商&#xff0c;ZJY準備去往一個新世界去旅游。這個世界的城市布局像一棵樹。每兩座城市之間只有一條路徑可以互達。每座城市都有一種寶石&#xff0c;有一定的價格。ZJY為了賺取最高利益&#xff0c;她會選擇從A城市買入再轉手…

一張圖看懂單機/集群/熱備/磁盤陣列(RAID)

單機部署(Standalone) 只有一個飲水機提供服務器&#xff0c;服務只部署一份 集群部署(Cluster) 多個飲水機同時提供服務&#xff0c;服務冗余部署&#xff0c;每個冗余的服務都對外提供服務&#xff0c;一個服務掛掉時依然可用 熱備部署(Hot-swap) 只有一個桶提供服務&#xf…

typescript vuex_Vue3+TypeScript完整項目上手教程

作者&#xff1a;TinssonTaihttps://juejin.im/post/6875713523968802829一個完整的Vue3Ts項目,支持.vue和.tsx寫法 項目地址&#xff1a;https://github.com/vincentzyc/vue3-demo.gitTypeScript 是JS的一個超集&#xff0c;主要提供了類型系統和對ES6的支持&#xff0c;使用 …

JS中window.showModalDialog()詳解

window.showModalDialog()方法用來創建一個顯示HTML內容的模態對話框。 window.showModelessDialog()方法用來創建一個顯示HTML內容的非模態對話框。 使用方法&#xff1a; vReturnValue window.showModalDialog(sURL [, vArguments] [,sFeatures]) vReturnValue window.show…

一個簡單的javascript節流器實現

節流器 javascript的節流器主要用于延緩某些動作的執行&#xff0c;比如ajax請求&#xff0c;如果input框注冊了input事件&#xff0c;那么當用戶輸入時就會持續的觸發這個事件&#xff0c;如果回調函數中持續的通過ajax調用后臺的接口&#xff0c;就會對服務器產生一定壓力。這…

一些會用到的知識

為什么80%的碼農都做不了架構師&#xff1f;>>> HtmlAgilityPack 用來解析HTML代碼 microsoft.mshtml CsQuery 解析HTML代碼 轉載于:https://my.oschina.net/uwith/blog/813725

eclipse怎么升級到java ee,如何為Java EE開發人員升級Eclipse?

Is there any non-painful way to upgrade an Eclipse installation? I have tried browsing the eclipse site but I cannot find an useful description.解決方案Add the update URL to your available sites:Window > Preferences > Install/Update > Available S…

LeetCode 7 Reverse Integer(反轉數字)

題目來源&#xff1a;https://leetcode.com/problems/reverse-integer/ Reverse digits of an integer. Example1: x 123, return 321Example2: x -123, return -321 解題思路&#xff1a; 其實這道題看起來非常簡單&#xff0c;要實現也是幾行代碼的事。但是有個小問題容易被…

各種蘊含算法思想的DP - 3

內容中包含 base64string 圖片造成字符過多&#xff0c;拒絕顯示轉載于:https://www.cnblogs.com/cmyg/p/9566723.html