Android 上傳圖片到阿里雲 OSS
阿新 • • 發佈:2019-01-04
本篇部落格主要介紹的是將本地圖片上傳到伺服器的方法技巧
首先附上阿里雲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返回給我們