Android實(shí)現(xiàn)阿里云oss上傳流程解析
購(gòu)買(mǎi)了阿里云的oss空間,于是用它來(lái)存儲(chǔ)圖片,不過(guò)中間的使用算是出了些問(wèn)題,導(dǎo)致很長(zhǎng)的才成功。
不得不說(shuō),阿里云文檔真的是無(wú)力吐槽。。。亂七八糟的。我完全是東拼西湊,才完成的圖片上傳功能。
走了很多的彎路,今天來(lái)記錄下。
服務(wù)器上傳:
阿里云上傳分服務(wù)器上傳和客戶(hù)端上傳,首先要分清,因?yàn)閮蛇呌胁顒e的,服務(wù)器的上傳簡(jiǎn)單很多,官方給的下載下來(lái),輸入配置的參數(shù)accessKeyId 和accessKeySecret 還有bucketName 就能夠上傳成功,很簡(jiǎn)單,這里也就不細(xì)說(shuō)了。
客戶(hù)端上傳:
這里著重來(lái)講下客戶(hù)端上傳,因?yàn)樗拥穆闊?和繁瑣一些。
教程的全篇都會(huì)講一句話(huà),移動(dòng)端是不受信任的環(huán)境,我的個(gè)人理解是,apk是個(gè)比較好被反編譯的,所有,如果將很多秘鑰寫(xiě)到APP中,就會(huì)存在泄露的問(wèn)題。所以,像上面服務(wù)器上傳那樣,直接在代碼里面寫(xiě)accessKeyId 和accessKeySecret,肯定是不安全的。所以,客戶(hù)端上傳,有兩個(gè)東西子知識(shí)點(diǎn)要去了解。
1.訪(fǎng)問(wèn)用戶(hù)RAM管理
這里需要進(jìn)行用戶(hù)的分配,分配一個(gè)專(zhuān)門(mén)操作阿里云 OSS的用戶(hù),并給予該用戶(hù)應(yīng)有的權(quán)限。
2.STS鑒權(quán)模式
OSS可以通過(guò)阿里云STS服務(wù),臨時(shí)進(jìn)行授權(quán)訪(fǎng)問(wèn)。阿里云STS (Security Token Service) 是為云計(jì)算用戶(hù)提供臨時(shí)訪(fǎng)問(wèn)令牌的Web服務(wù)。通過(guò)STS,您可以為第三方應(yīng)用或聯(lián)邦用戶(hù)(用戶(hù)身份由您自己管理)頒發(fā)一個(gè)自定義時(shí)效和權(quán)限的訪(fǎng)問(wèn)憑證
我的理解就是:用分配的用戶(hù)的秘鑰去操作單個(gè)步驟,實(shí)現(xiàn)權(quán)限的分配管理。
開(kāi)始準(zhǔn)備工作
1:用戶(hù)RAM管理
創(chuàng)建RAM:步驟參考文檔。就是到《訪(fǎng)問(wèn)控制RAM》去設(shè)置子用戶(hù),并分配給子用戶(hù)權(quán)限。
https://ram.console.aliyun.com/?spm=5176.2020520153.aliyun_sidebar.11.7f5a43f7vo9spw&accounttraceid=dfef632a-67d6-4f51-a3ff-beea37b5db73#/overview
2.進(jìn)入對(duì)象儲(chǔ)存的控制臺(tái),創(chuàng)建對(duì)應(yīng)的AK。
對(duì)象儲(chǔ)存 - 安全令牌-安全令牌快捷配置 - 開(kāi)始授權(quán),
授權(quán)成功后,會(huì)出來(lái)一系列參數(shù)AccessKeyID 和AccessKeySecret 和RoleArn ,這些比較重要,需要在請(qǐng)求中用于授權(quán),不要泄露。
3.準(zhǔn)備STS服務(wù)器,用于請(qǐng)求阿里云OSS 分發(fā)出Token,然后客戶(hù)端通過(guò)token進(jìn)行訪(fǎng)問(wèn)和上傳下載。
去阿里云上下載一個(gè)sts-server作為服務(wù)器端,專(zhuān)門(mén)用來(lái)分發(fā)token,這個(gè)直接去阿里云下載代碼,部署到服務(wù)器上運(yùn)行就行。
返回的一個(gè)json數(shù)據(jù),里面包含了SecurityToken.
4.開(kāi)始編寫(xiě)客戶(hù)端的代碼
首先加入依賴(lài)包
implementation 'com.aliyun.dpa:oss-android-sdk:+'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.squareup.okio:okio:1.9.0'
加入權(quán)限設(shè)置:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
加入混淆設(shè)置;注意,這里是重點(diǎn),一定要加入,不然會(huì)出各種奇怪的問(wèn)題。
加入到文件proguard-rules.pro中
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
初始化對(duì)象OSSCLIENT
String endpoint = "http://oss-cn-shenzhen.aliyuncs.com"; String stsServer = "../sts-server/sts-server/sts.php"; String callbackAddress = "http://oss-demo.aliyuncs.com:23450"; //推薦使用OSSAuthCredentialsProvider。token過(guò)期可以及時(shí)更新 OSSCredentialProvider credentialProvider = new OSSAuthCredentialsProvider(stsServer); //該配置類(lèi)如果不設(shè)置,會(huì)有默認(rèn)配置,具體可看該類(lèi) ClientConfiguration conf = new ClientConfiguration(); conf.setConnectionTimeout(15 * 1000); // 連接超時(shí),默認(rèn)15秒 conf.setSocketTimeout(15 * 1000); // socket超時(shí),默認(rèn)15秒 conf.setMaxConcurrentRequest(5); // 最大并發(fā)請(qǐng)求數(shù),默認(rèn)5個(gè) conf.setMaxErrorRetry(2); // 失敗后最大重試次數(shù),默認(rèn)2次 oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider,conf);
上傳圖片代碼:
{ // 構(gòu)造上傳請(qǐng)求 PutObjectRequest put = new PutObjectRequest("hzltest1", "333333333333333333333333", FilePath);//PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
// 異步上傳時(shí)可以設(shè)置進(jìn)度回調(diào) put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() { @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) { Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); } }); OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { Log.d("PutObject", "UploadSuccess"); Log.d("ETag", result.getETag()); Log.d("RequestId", result.getRequestId()); } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { // 請(qǐng)求異常 if (clientExcepion != null) { // 本地異常如網(wǎng)絡(luò)異常等 clientExcepion.printStackTrace(); } if (serviceException != null) { // 服務(wù)異常 Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); Log.e("HostId", serviceException.getHostId()); Log.e("RawMessage", serviceException.getRawMessage()); } } }); }
到底,文件能夠上傳成功就是OK的。
這里上傳的代碼還是比較簡(jiǎn)單的,主要難在配置,和阿里云本身的文檔寫(xiě)的很分散,東一塊西一塊,你需要首先了解很多技術(shù)才能很快的上手,否則,對(duì)于一個(gè)剛購(gòu)買(mǎi)OSS的人來(lái)說(shuō),用起來(lái)著實(shí)是麻煩。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android Studio Gradle 更換阿里云鏡像的方法
- Android 阿里云OSS文件上傳的實(shí)現(xiàn)示例
- Android Studio新建工程默認(rèn)在build.gradle中加入maven阿里源的問(wèn)題
- Android Oss上傳圖片的使用示例
- Android仿Boss直聘文本日期混合滾輪選擇器示例
- 打飛機(jī)游戲終極BOSS Android實(shí)戰(zhàn)打飛機(jī)游戲完結(jié)篇
- Android FTP服務(wù)器上傳文件攻略(代碼詳解)
- Android apk 項(xiàng)目一鍵打包并上傳到蒲公英的實(shí)現(xiàn)方法
- Android 拍照選擇圖片并上傳功能的實(shí)現(xiàn)思路(包含權(quán)限動(dòng)態(tài)獲取)
相關(guān)文章
Android編程之電池電量信息更新的方法(基于BatteryService實(shí)現(xiàn))
這篇文章主要介紹了Android編程之電池電量信息更新的方法,主要基于BatteryService實(shí)現(xiàn)該功能,以實(shí)例形式分析了Android獲取電池電量的具體步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-11-11Android 手動(dòng)獲取判斷處理權(quán)限
本篇文章主要介紹了Android手動(dòng)獲取判斷處理權(quán)限的方法,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05Android開(kāi)發(fā)中RecyclerView模仿探探左右滑動(dòng)布局功能
本文給大家分享android開(kāi)發(fā)中RecyclerView模仿探探左右滑動(dòng)布局功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01Android實(shí)現(xiàn)紙飛機(jī)的簡(jiǎn)單操作
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)紙飛機(jī)的簡(jiǎn)單操作,類(lèi)似于漂流瓶功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android中AlertDialog四種對(duì)話(huà)框的最科學(xué)編寫(xiě)用法(實(shí)例代碼)
這篇文章主要介紹了Android中AlertDialog四種對(duì)話(huà)框的最科學(xué)編寫(xiě)用法,本文通過(guò)代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11Android開(kāi)發(fā)自定義雙向SeekBar拖動(dòng)條控件
這篇文章主要為大家介紹了Android開(kāi)發(fā)自定義雙向SeekBar拖動(dòng)條控件使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android開(kāi)發(fā)之Location用法實(shí)例分析
這篇文章主要介紹了Android開(kāi)發(fā)中Location用法,結(jié)合實(shí)例形式分析了Android使用location控件獲取經(jīng)緯度信息的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10Android應(yīng)用開(kāi)發(fā)中WebView的常用方法筆記整理
WebView即是在安卓本地應(yīng)用中打開(kāi)網(wǎng)頁(yè)視圖功能,其中對(duì)于JavaScript加載的各項(xiàng)操作是重點(diǎn)和難點(diǎn),本文就為大家送上Android應(yīng)用開(kāi)發(fā)中WebView的常用方法筆記整理2016-05-05Android PopupWindow實(shí)現(xiàn)遮罩層效果
這篇文章主要為大家詳細(xì)介紹了Android PopupWindow實(shí)現(xiàn)遮罩層效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10