【GT-應用開發之OSS儲存(一)】

NO IMAGE

前言:在做聊天APP的時候,需要涉及到圖片訊息的上傳儲存,傳統方式會將圖片儲存在伺服器上,但是這樣做的話會給伺服器造成較大的壓力。很幸運,阿里云為我們提供了海量、安全、低成本、高可靠的雲端儲存服務—OSS。

    何謂物件儲存OSS,阿里雲給它的定義是:阿里雲物件儲存服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。您可以通過呼叫 API,在任何應用、任何時間、任何地點上傳和下載資料,也可以通過 Web 控制檯對資料進行簡單的管理。OSS 適合存放任意型別的檔案,適合各種網站、開發企業及開發者使用。

    如何使用物件儲存OSS呢?首先需要建立用來儲存檔案的儲存空間,操作步驟可自行到阿里雲閱覽。與剛剛提到的聊天APP相關的技術是OSS直傳技術,假定已經開通了服務並建立了所需要的AccessKeyId與AccessKeySecret,接下開我們一起開始安卓端demo的編寫:

   第一步,環境配置

   提供了兩種配置方法,一種是直接匯入相關的jar包(自行到阿里雲下載),另外一種則是利用Gradle外掛依賴Maven進行配置,在build.gradle檔案中加入如下程式碼:

    

  1. dependencies {
  2. compile 'com.aliyun.dpa:oss-android-sdk: '
  3. compile 'com.squareup.okhttp3:okhttp:3.4.1'
  4. compile 'com.squareup.okio:okio:1.9.0'
  5. }

   第二步,初始化

   阿里雲針對安卓直傳提供了一個OSSClient的概念,它是OSS服務的Android客戶端,為使用者提供了一系列的方法可用來操作檔案和儲存空間,初始化部分程式碼如下:

public OssService initOSS(String endpoint, String bucket) {
OSSCredentialProvider credentialProvider;
//使用自己的獲取STSToken的類
   credentialProvider = new OSSAuthCredentialsProvider(Config.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 oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
OSSLog.enableLog();
return new OssService(oss, bucket);
}

    上述程式碼中需要涉及兩個概念EndPoint地址和bucket,其中EndPoint是區域地址,而bucket則是儲存空間的名字

    第三步,上傳檔案

    圖片訊息彈出框提示,支援相簿選擇與拍照上傳,獲得圖片的路徑,並通過OSS提供的方法進行圖片的上傳,上傳程式碼如下:

public void asyncPutImage(String object, String localFile, final Handler handler) {
final long upload_start = System.currentTimeMillis();
if (object.equals("")) {
Log.w("AsyncPutImage", "ObjectNull");
return;
}
File file = new File(localFile);
if (!file.exists()) {
Log.w("AsyncPutImage", "FileNotExist");
Log.w("LocalFile", localFile);
return;
}
// 構造上傳請求
    PutObjectRequest put = new PutObjectRequest(mBucket, object, localFile);
put.setCRC64(OSSRequest.CRC64Config.YES);
// 非同步上傳時可以設定進度回撥
    put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
Log.d("PutObject", "currentSize: "   currentSize   " totalSize: "   totalSize);
int progress = (int) (100 * currentSize / totalSize);
}
});
OSSAsyncTask task = mOss.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());
long upload_end = System.currentTimeMillis();
handler.sendEmptyMessage(110);
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
String info = "";
// 請求異常
            if (clientExcepion != null) {
// 本地異常如網路異常等
                clientExcepion.printStackTrace();
info = clientExcepion.toString();
}
if (serviceException != null) {
// 服務異常
                Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
info = serviceException.toString();
handler.sendEmptyMessage(119);
}
}
});
}
  最後一步,測試

           執行APP(前提是STS服務開啟),上傳圖片成功後登入阿里雲控制檯相應的儲存空間下檢視圖片是否上傳成功。

           PS:上面提到一個STSServer,再下一篇文章我們一起了解,謝謝觀看