android 阿里雲oss上傳


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

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

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

服務器上傳:


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

客戶端上傳:


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

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

 

1.訪問用戶RAM管理

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

2.STS鑒權模式

 

 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.

 

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

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

 

加入到文件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的人來說,用起來着實是麻煩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM