購買了阿里云的oss空間,于是用它來存儲圖片,不過中間的使用算是出了些問題,導致很長的才成功。
10年積累的成都網(wǎng)站建設、網(wǎng)站設計經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先做網(wǎng)站后付款的網(wǎng)站建設流程,更有興山免費網(wǎng)站建設讓你可以放心的選擇與我們合作。不得不說,阿里云文檔真的是無力吐槽。。。亂七八糟的。我完全是東拼西湊,才完成的圖片上傳功能。
走了很多的彎路,今天來記錄下。
服務器上傳:
阿里云上傳分服務器上傳和客戶端上傳,首先要分清,因為兩邊有差別的,服務器的上傳簡單很多,官方給的下載下來,輸入配置的參數(shù)accessKeyId 和accessKeySecret 還有bucketName 就能夠上傳成功,很簡單,這里也就不細說了。
客戶端上傳:
這里著重來講下客戶端上傳,因為它更加的麻煩 和繁瑣一些。
教程的全篇都會講一句話,移動端是不受信任的環(huán)境,我的個人理解是,apk是個比較好被反編譯的,所有,如果將很多秘鑰寫到APP中,就會存在泄露的問題。所以,像上面服務器上傳那樣,直接在代碼里面寫accessKeyId 和accessKeySecret,肯定是不安全的。所以,客戶端上傳,有兩個東西子知識點要去了解。
1.訪問用戶RAM管理
這里需要進行用戶的分配,分配一個專門操作阿里云 OSS的用戶,并給予該用戶應有的權限。
2.STS鑒權模式
OSS可以通過阿里云STS服務,臨時進行授權訪問。阿里云STS (Security Token Service) 是為云計算用戶提供臨時訪問令牌的Web服務。通過STS,您可以為第三方應用或聯(lián)邦用戶(用戶身份由您自己管理)頒發(fā)一個自定義時效和權限的訪問憑證
我的理解就是:用分配的用戶的秘鑰去操作單個步驟,實現(xiàn)權限的分配管理。
開始準備工作
1:用戶RAM管理
創(chuàng)建RAM:步驟參考文檔。就是到《訪問控制RAM》去設置子用戶,并分配給子用戶權限。
https://ram.console.aliyun.com/?spm=5176.2020520153.aliyun_sidebar.11.7f5a43f7vo9spw&accounttraceid=dfef632a-67d6-4f51-a3ff-beea37b5db73#/overview
2.進入對象儲存的控制臺,創(chuàng)建對應的AK。
對象儲存 - 安全令牌-安全令牌快捷配置 - 開始授權,
授權成功后,會出來一系列參數(shù)AccessKeyID 和AccessKeySecret 和RoleArn ,這些比較重要,需要在請求中用于授權,不要泄露。
3.準備STS服務器,用于請求阿里云OSS 分發(fā)出Token,然后客戶端通過token進行訪問和上傳下載。
去阿里云上下載一個sts-server作為服務器端,專門用來分發(fā)token,這個直接去阿里云下載代碼,部署到服務器上運行就行。
返回的一個json數(shù)據(jù),里面包含了SecurityToken.
4.開始編寫客戶端的代碼
首先加入依賴包
implementation 'com.aliyun.dpa:oss-android-sdk:+'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.squareup.okio:okio:1.9.0'
加入權限設置:
加入混淆設置;注意,這里是重點,一定要加入,不然會出各種奇怪的問題。
加入到文件proguard-rules.pro中
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
初始化對象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過期可以及時更新 OSSCredentialProvider credentialProvider = new OSSAuthCredentialsProvider(stsServer); //該配置類如果不設置,會有默認配置,具體可看該類 ClientConfiguration conf = new ClientConfiguration(); conf.setConnectionTimeout(15 * 1000); // 連接超時,默認15秒 conf.setSocketTimeout(15 * 1000); // socket超時,默認15秒 conf.setMaxConcurrentRequest(5); // 大并發(fā)請求數(shù),默認5個 conf.setMaxErrorRetry(2); // 失敗后大重試次數(shù),默認2次 oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider,conf);