1. 程式人生 > >Android 上傳圖片到阿里雲 OSS

Android 上傳圖片到阿里雲 OSS

本篇部落格主要介紹的是將本地圖片上傳到伺服器的方法技巧

首先附上阿里雲oss官網SDK介紹:點選開啟連結

附上官方推薦的demo 點選開啟連結

在app的build中配置oss :compile 'com.aliyun.dpa:oss-android-sdk:+'

技術相對簡單,主要是將這些技術結合起來的例子並不多

首先先初始化oss物件

        // ACCESS_ID,ACCESS_KEY是在阿里雲申請的
        OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(ACCESS_ID, ACCESS_KEY);
        ClientConfiguration conf = new ClientConfiguration();
        conf.setConnectionTimeout(15 * 1000); // 連線超時,預設15秒
        conf.setSocketTimeout(15 * 1000); // socket超時,預設15秒
        conf.setMaxConcurrentRequest(8); // 最大併發請求數,預設5個
        conf.setMaxErrorRetry(2); // 失敗後最大重試次數,預設2次

        // oss為全域性變數,OSS_ENDPOINT是一個OSS區域地址
        oss = new OSSClient(getApplicationContext(), OSS_ENDPOINT, credentialProvider, conf);

oss上傳圖片分為同步和非同步 

同步的方法

// 構造上傳請求
PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
// 檔案元資訊的設定是可選的
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setContentType("application/octet-stream"); // 設定content-type
// metadata.setContentMD5(BinaryUtil.calculateBase64Md5(uploadFilePath)); // 校驗MD5
// put.setMetadata(metadata);
try {
    PutObjectResult putResult = oss.putObject(put);
    Log.d("PutObject", "UploadSuccess");
    Log.d("ETag", putResult.getETag());
    Log.d("RequestId", putResult.getRequestId());
} catch (ClientException e) {
    // 本地異常如網路異常等
    e.printStackTrace();
} catch (ServiceException e) {
    // 服務異常
    Log.e("RequestId", e.getRequestId());
    Log.e("ErrorCode", e.getErrorCode());
    Log.e("HostId", e.getHostId());
    Log.e("RawMessage", e.getRawMessage());
}

此處這個bucketName是在阿里雲平臺上配置的 用來儲存檔案 可以設定私有公有等屬性 

objectKey為檔案的名字 用來從平臺上查詢圖片

FilePath為所選檔案的uri路徑

非同步上傳的方法

// 構造上傳請求
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());
        }
    }
});
// task.cancel(); // 可以取消任務
// task.waitUntilFinished(); // 可以等待任務完成

一般上傳成功時候 客戶端需要把檔案的objectkey傳給後臺 後臺通過拼接然後把圖片的url返回給我們