前言:在做聊天APP的時候,需要涉及到圖片消息的上傳存儲,傳統方式會將圖片存儲在服務器上,但是這樣做的話會給服務器造成較大的壓力。很幸運,阿里云爲我們提供了海量、安全、低成本、高可靠的雲存儲服務—OSS。
何謂對象存儲OSS,阿里雲給它的定義是:阿里雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。您可以通過調用 API,在任何應用、任何時間、任何地點上傳和下載數據,也可以通過 Web 控制檯對數據進行簡單的管理。OSS 適合存放任意類型的文件,適合各種網站、開發企業及開發者使用。
如何使用對象存儲OSS呢?首先需要創建用來存儲文件的存儲空間,操作步驟可自行到阿里雲閱覽。與剛剛提到的聊天APP相關的技術是OSS直傳技術,假定已經開通了服務並創建了所需要的AccessKeyId與AccessKeySecret,接下開我們一起開始安卓端demo的編寫:
第一步,環境配置
提供了兩種配置方法,一種是直接導入相關的jar包(自行到阿里雲下載),另外一種則是利用Gradle插件依賴Maven進行配置,在build.gradle文件中加入如下代碼:
dependencies {
compile 'com.aliyun.dpa:oss-android-sdk:+'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.9.0'
}
第二步,初始化
阿里雲針對安卓直傳提供了一個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,再下一篇文章我們一起了解,謝謝觀看