This topic describes how to upload objects to OSS in Android.
Simple upload
Simple upload uses the PutObject operation to upload selected objects to OSS at a
time. For more information, see PutObject in OSS API Reference.
- Processing logic
- After selecting Upload, you can select the local file to load.
- OssDemo sends a request after obtaining the address of sts_server.
- sts_server returns AccessKeyId, AccessKeySecret, SecurityToken, and Expiration.
- After obtaining the information, OssDemo calls the SDK to create OSSClient and perform simple upload.
- Code analysis
- Generate a Button control.
Location: res/layout/content_main.xml Content: <Button style="? android:attr/buttonStyleSmall" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/upload" android:id="@+id/upload" />
- Click Upload. Select the object to upload.
Code segment for function implementation:
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); } }
- Call the upload API operation of the SDK.
Code segment for function implementation:
@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("object: " + picturePath + "\nsize: " + String.valueOf(file.length())); } catch (IOException e) { e.printStackTrace(); displayInfo(e.toString()); } //Upload the object based on different operations. if (requestCode == RESULT_UPLOAD_IMAGE) { final EditText editText = (EditText) findViewById(R.id.edit_text); String objectName = editText.getText().toString(); //Call the simple upload operation to upload an object. ossService.asyncPutImage(objectName, picturePath, getPutCallback(), new ProgressCallbackFactory<PutObjectRequest>().get()); } } }
The processing of the upload result is omitted here. For more information, see onSuccess and onFailure in the source code.
- Generate a Button control.
Multipart upload-based resumable upload
You can call the MultipartUpload operation of OSS to implement resumable upload.
- Processing logic
- After selecting Upload, you can select the local file to load.
- OssDemo sends a request after obtaining the address of sts_server.
- sts_server returns AccessKeyId, AccessKeySecret, SecurityToken, and Expiration.
- After obtaining the information, OssDemo calls the SDK to create OSSClient and perform multipart upload.
- Click Pause. If the multipart upload task is not complete, click Continue to resume the upload from the position where the last upload stops.
- Code analysis
- Generate a Button control.
Location: res/layout/content_main.xml Content: <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" />
- Click Upload. Select the object to upload.
Code segment for function implementation:
Button multipart_upload = (Button) findViewById(R.id.multipart_upload); multipart_upload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //To simplify the upload concurrency, run only one resumable upload task. Intent i = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_PAUSEABLEUPLOAD_IMAGE); } } );
- Click Continue to complete resumable upload.
Code segment for function implementation:
Click Upload: //Call the MultipartUpload operation of the SDK to upload an object. 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()); The bottom-layer logic to encrypt the SDK: Implement resumable upload by using asyncUpload in multiPartUploadManager. //During resumable upload, PauseableUploadTask can be called to suspend a 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; }
- Generate a Button control.