簡單上傳

簡單上傳就是調用OSS API中的Put Object介面,一次性將選擇的檔案上傳到OSS上。

調用邏輯
  1. 選擇上傳後,可以選擇需要上傳的本地檔案。
  2. 選擇後OssDemo在獲取sts_server的地址後,發送請求。
  3. sts_server返回AccessKeyId、AccessKeySecret、SecurityToken、Expiration。
  4. OssDemo獲取這些資訊後,調用SDK,構建OssClient,進行簡單上傳。
具體代碼
  1. 生成一個Button控制項。
    位置:
     res/layout/content_main.xml
     內容:
     <Button
         style="?android:attr/buttonStyleSmall"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:text="@string/upload"
         android:id="@+id/upload" />
  2. 點擊上傳,選擇要上傳的檔案。

    函數實現片段:

    Button upload = (Button) findViewById(R.id.upload);
     upload.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             Intent i = new Intent(
                     Intent.ACTION_PICK,
                     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
             startActivityForResult(i, RESULT_UPLOAD_IMAGE);
         }
     }
  3. 調用SDK的上傳介面。

    函數實現片段:

    @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if ((requestCode == RESULT_UPLOAD_IMAGE || requestCode == RESULT_PAUSEABLEUPLOAD_IMAGE) && resultCode == RESULT_OK && null != data) {
             Uri selectedImage = data.getData();
             String[] filePathColumn = { MediaStore.Images.Media.DATA };
             Cursor cursor = getContentResolver().query(selectedImage,
                     filePathColumn, null, null, null);
             cursor.moveToFirst();
             int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
             String picturePath = cursor.getString(columnIndex);
             Log.d("PickPicture", picturePath);
             cursor.close();
             try {
                 Bitmap bm = ImageDisplayer.autoResizeFromLocalFile(picturePath);
                 displayImage(bm);
                 File file = new File(picturePath);
                 displayInfo("檔案: " + picturePath + "\n大小: " + String.valueOf(file.length()));
             }
             catch (IOException e) {
                 e.printStackTrace();
                 displayInfo(e.toString());
             }
             //根據操作不同完成普通上傳或者斷點上傳
             if (requestCode == RESULT_UPLOAD_IMAGE) {
                 final EditText editText = (EditText) findViewById(R.id.edit_text);
                 String objectName = editText.getText().toString();
                 //調用簡單上傳介面上傳
                 ossService.asyncPutImage(objectName, picturePath, getPutCallback(), new ProgressCallbackFactory<PutObjectRequest>().get());
             }
         }
     }

    這裡省略了對上傳結果的處理,可以參考源碼中的onSuccess和onFailure的處理。

基於分區上傳實現的斷點續傳上傳

調用OSS API中的Multipart Upload(分區上傳)介面實現斷點續傳的效果。

調用邏輯
  1. 選擇上傳後,可以選擇需要上傳的本地檔案。
  2. 選擇後OssDemo在獲取sts_server的地址後,發送請求。
  3. sts_server返回AccessKeyId、AccessKeySecret、SecurityToken、Expiration。
  4. OssDemo獲取這些資訊後,調用SDK,構建OssClient,進行分區上傳。
  5. 點擊暫停時,如果分區上傳沒有結束,再點擊繼續時,可以接著未完成的地方繼續上傳。以達到斷點續傳的效果。
具體代碼
  1. 生成一個Button控制項。
    位置:
     res/layout/content_main.xml
     內容:
     <Button
         style="?android:attr/buttonStyleSmall"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:text="@string/multipart_upload"
         android:id="@+id/multipart_upload" />
  2. 點擊上傳,選擇要上傳的檔案。

    函數實現片段:

    Button multipart_upload = (Button) findViewById(R.id.multipart_upload);
     multipart_upload.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             //為了簡單化,這裡只會同時運行一個斷點上傳的任務
             Intent i = new Intent(
                     Intent.ACTION_PICK,
                     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
             startActivityForResult(i, RESULT_PAUSEABLEUPLOAD_IMAGE);
         }
     }
     );
  3. 點擊上傳,繼續時的斷點續傳。

    函數實現片段:

    點擊上傳: //這裡調用SDK的分區上傳介面來上傳 task = ossService.asyncMultiPartUpload(objectName, picturePath, getMultiPartCallback().addCallback(new Runnable() {     @Override     public void run() {         pauseTaskStatus = TASK_NONE;         multipart_resume.setEnabled(false);         multipart_pause.setEnabled(false);         task = null;     } }}, new ProgressCallbackFactory<PauseableUploadRequest>().get()); 底層對SDK的封裝邏輯,可以看到是在multiPartUploadManager中的asyncUpload實現的斷點續傳上傳 //斷點上傳,返回的task可以用來暫停任務 public PauseableUploadTask asyncMultiPartUpload(String object,                                                 String localFile,                                                 @NonNull final OSSCompletedCallback<PauseableUploadRequest, PauseableUploadResult> userCallback,                                                 final OSSProgressCallback<PauseableUploadRequest> userProgressCallback) {     if (object.equals("")) {         Log.w("AsyncMultiPartUpload", "ObjectNull");         return null;     }     File file = new File(localFile);     if (!file.exists()) {         Log.w("AsyncMultiPartUpload", "FileNotExist");         Log.w("LocalFile", localFile);         return null;     }     Log.d("MultiPartUpload", localFile);     PauseableUploadTask task = multiPartUploadManager.asyncUpload(object, localFile, userCallback, userProgressCallback);     return task; }