簡單上傳
簡單上傳就是調用OSS API中的Put Object介面,一次性將選擇的檔案上傳到OSS上。
調用邏輯
- 選擇上傳後,可以選擇需要上傳的本地檔案。
- 選擇後OssDemo在獲取sts_server的地址後,發送請求。
- sts_server返回AccessKeyId、AccessKeySecret、SecurityToken、Expiration。
- OssDemo獲取這些資訊後,調用SDK,構建OssClient,進行簡單上傳。
具體代碼
- 生成一個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" />
- 點擊上傳,選擇要上傳的檔案。
函數實現片段:
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); } }
- 調用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(分區上傳)介面實現斷點續傳的效果。
調用邏輯
- 選擇上傳後,可以選擇需要上傳的本地檔案。
- 選擇後OssDemo在獲取sts_server的地址後,發送請求。
- sts_server返回AccessKeyId、AccessKeySecret、SecurityToken、Expiration。
- OssDemo獲取這些資訊後,調用SDK,構建OssClient,進行分區上傳。
- 點擊暫停時,如果分區上傳沒有結束,再點擊繼續時,可以接著未完成的地方繼續上傳。以達到斷點續傳的效果。
具體代碼
- 生成一個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" />
- 點擊上傳,選擇要上傳的檔案。
函數實現片段:
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); } } );
- 點擊上傳,繼續時的斷點續傳。
函數實現片段:
點擊上傳: //這裡調用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; }