1. 程式人生 > 程式設計 >Android實現阿里雲oss上傳流程解析

Android實現阿里雲oss上傳流程解析

購買了阿里雲的oss空間,於是用它來儲存圖片,不過中間的使用算是出了些問題,導致很長的才成功。

不得不說,阿里雲文件真的是無力吐槽。。。亂七八糟的。我完全是東拼西湊,才完成的圖片上傳功能。

走了很多的彎路,今天來記錄下。

伺服器上傳:

阿里雲上傳分伺服器上傳和客戶端上傳,首先要分清,因為兩邊有差別的,伺服器的上傳簡單很多,官方給的下載下來,輸入配置的引數accessKeyId 和accessKeySecret 還有bucketName 就能夠上傳成功,很簡單,這裡也就不細說了。

客戶端上傳:

這裡著重來講下客戶端上傳,因為它更加的麻煩 和繁瑣一些。

教程的全篇都會講一句話,移動端是不受信任的環境,我的個人理解是,apk是個比較好被反編譯的,所有,如果將很多祕鑰寫到APP中,就會存在洩露的問題。所以,像上面伺服器上傳那樣,直接在程式碼裡面寫accessKeyId 和accessKeySecret,肯定是不安全的。所以,客戶端上傳,有兩個東西子知識點要去了解。

Android實現阿里雲oss上傳流程解析

1.訪問使用者RAM管理

這裡需要進行使用者的分配,分配一個專門操作阿里雲 OSS的使用者,並給予該使用者應有的許可權。

2.STS鑑權模式

Android實現阿里雲oss上傳流程解析

OSS可以通過阿里雲STS服務,臨時進行授權訪問。阿里雲STS (Security Token Service) 是為雲端計算使用者提供臨時訪問令牌的Web服務。通過STS,您可以為第三方應用或聯邦使用者(使用者身份由您自己管理)頒發一個自定義時效和許可權的訪問憑證

我的理解就是:用分配的使用者的祕鑰去操作單個步驟,實現許可權的分配管理。

開始準備工作

1:使用者RAM管理

建立RAM:步驟參考文件。就是到《訪問控制RAM》去設定子使用者,並分配給子使用者許可權。

https://ram.console.aliyun.com/?spm=5176.2020520153.aliyun_sidebar.11.7f5a43f7vo9spw&accounttraceid=dfef632a-67d6-4f51-a3ff-beea37b5db73#/overview

2.進入物件儲存的控制檯,建立對應的AK。

物件儲存 - 安全令牌-安全令牌快捷配置 - 開始授權,

授權成功後,會出來一系列引數AccessKeyID 和AccessKeySecret 和RoleArn ,這些比較重要,需要在請求中用於授權,不要洩露。

3.準備STS伺服器,用於請求阿里雲OSS 分發出Token,然後客戶端通過token進行訪問和上傳下載。

去阿里雲上下載一個sts-server作為伺服器端,專門用來分發token,這個直接去阿里雲下載程式碼,部署到伺服器上執行就行。

返回的一個json資料,裡面包含了SecurityToken.

Android實現阿里雲oss上傳流程解析

4.開始編寫客戶端的程式碼

首先加入依賴包

implementation 'com.aliyun.dpa:oss-android-sdk:+'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.squareup.okio:okio:1.9.0'

 加入許可權設定:

<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" />

加入混淆設定;注意,這裡是重點,一定要加入,不然會出各種奇怪的問題。

Android實現阿里雲oss上傳流程解析

加入到檔案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); // 最大併發請求數,預設5個
    conf.setMaxErrorRetry(2); // 失敗後最大重試次數,預設2次
    oss = new OSSClient(getApplicationContext(),endpoint,credentialProvider,conf);

上傳圖片程式碼:

{
// 構造上傳請求
  PutObjectRequest put = new PutObjectRequest("hzltest1","333333333333333333333333",FilePath);//PutObjectRequest put = new PutObjectRequest("<bucketName>","<objectKey>","<uploadFilePath>");
// 非同步上傳時可以設定進度回撥
    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) {
        // 請求異常
        if (clientExcepion != null) {
          // 本地異常如網路異常等
          clientExcepion.printStackTrace();
        }
        if (serviceException != null) {
          // 服務異常
          Log.e("ErrorCode",serviceException.getErrorCode());
          Log.e("RequestId",serviceException.getRequestId());
          Log.e("HostId",serviceException.getHostId());
          Log.e("RawMessage",serviceException.getRawMessage());
        }
      }
    });
 
  }

到底,檔案能夠上傳成功就是OK的。

這裡上傳的程式碼還是比較簡單的,主要難在配置,和阿里雲本身的文件寫的很分散,東一塊西一塊,你需要首先了解很多技術才能很快的上手,否則,對於一個剛購買OSS的人來說,用起來著實是麻煩。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。