全部产品
对象存储 OSS

上传文件

更新时间:2017-06-07 13:26:11   分享:   

简单上传

简单上传就是调用OSS API中的Put Object接口,一次性将选择的文件上传到OSS上。

调用逻辑

  1. 选择上传后,可以选择需要上传的本地文件。
  2. 选择后OssDemo在获取sts_server的地址后,发送请求。
  3. sts_server返回AccessKeyId、AccessKeySecret、SecurityToken、Expiration。
  4. OssDemo获取这些信息后,调用SDK,构建OssClient,进行简单上传。

具体代码

  1. 生成一个Button控件。

    1. 位置:
    2. res/layout/content_main.xml
    3. 内容:
    4. <Button
    5. style="?android:attr/buttonStyleSmall"
    6. android:layout_height="wrap_content"
    7. android:layout_width="wrap_content"
    8. android:text="@string/upload"
    9. android:id="@+id/upload" />
  2. 点击上传,选择要上传的文件。
    函数实现片段:

    1. Button upload = (Button) findViewById(R.id.upload);
    2. upload.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. Intent i = new Intent(
    6. Intent.ACTION_PICK,
    7. android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    8. startActivityForResult(i, RESULT_UPLOAD_IMAGE);
    9. }
    10. }
  3. 调用SDK的上传接口。
    函数实现片段:

    1. @Override
    2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    3. super.onActivityResult(requestCode, resultCode, data);
    4. if ((requestCode == RESULT_UPLOAD_IMAGE || requestCode == RESULT_PAUSEABLEUPLOAD_IMAGE) && resultCode == RESULT_OK && null != data) {
    5. Uri selectedImage = data.getData();
    6. String[] filePathColumn = { MediaStore.Images.Media.DATA };
    7. Cursor cursor = getContentResolver().query(selectedImage,
    8. filePathColumn, null, null, null);
    9. cursor.moveToFirst();
    10. int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    11. String picturePath = cursor.getString(columnIndex);
    12. Log.d("PickPicture", picturePath);
    13. cursor.close();
    14. try {
    15. Bitmap bm = ImageDisplayer.autoResizeFromLocalFile(picturePath);
    16. displayImage(bm);
    17. File file = new File(picturePath);
    18. displayInfo("文件: " + picturePath + "\n大小: " + String.valueOf(file.length()));
    19. }
    20. catch (IOException e) {
    21. e.printStackTrace();
    22. displayInfo(e.toString());
    23. }
    24. //根据操作不同完成普通上传或者断点上传
    25. if (requestCode == RESULT_UPLOAD_IMAGE) {
    26. final EditText editText = (EditText) findViewById(R.id.edit_text);
    27. String objectName = editText.getText().toString();
    28. //调用简单上传接口上传
    29. ossService.asyncPutImage(objectName, picturePath, getPutCallback(), new ProgressCallbackFactory<PutObjectRequest>().get());
    30. }
    31. }
    32. }

    这里省略了对上传结果的处理,可以参考源码中的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控件。

    1. 位置:
    2. res/layout/content_main.xml
    3. 内容:
    4. <Button
    5. style="?android:attr/buttonStyleSmall"
    6. android:layout_height="wrap_content"
    7. android:layout_width="wrap_content"
    8. android:text="@string/multipart_upload"
    9. android:id="@+id/multipart_upload" />
  2. 点击上传,选择要上传的文件。
    函数实现片段:

    1. Button multipart_upload = (Button) findViewById(R.id.multipart_upload);
    2. multipart_upload.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. //为了简单化,这里只会同时运行一个断点上传的任务
    6. Intent i = new Intent(
    7. Intent.ACTION_PICK,
    8. android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    9. startActivityForResult(i, RESULT_PAUSEABLEUPLOAD_IMAGE);
    10. }
    11. }
    12. );
  3. 点击上传,继续时的断点续传。
    函数实现片段:

    1. 点击上传:
    2. //这里调用SDK的分片上传接口来上传
    3. task = ossService.asyncMultiPartUpload(objectName, picturePath, getMultiPartCallback().addCallback(new Runnable() {
    4. @Override
    5. public void run() {
    6. pauseTaskStatus = TASK_NONE;
    7. multipart_resume.setEnabled(false);
    8. multipart_pause.setEnabled(false);
    9. task = null;
    10. }
    11. }}, new ProgressCallbackFactory<PauseableUploadRequest>().get());
    12. 底层对SDK的封装逻辑,可以看到是在multiPartUploadManager中的asyncUpload实现的断点续传上传
    13. //断点上传,返回的task可以用来暂停任务
    14. public PauseableUploadTask asyncMultiPartUpload(String object,
    15. String localFile,
    16. @NonNull final OSSCompletedCallback<PauseableUploadRequest, PauseableUploadResult> userCallback,
    17. final OSSProgressCallback<PauseableUploadRequest> userProgressCallback) {
    18. if (object.equals("")) {
    19. Log.w("AsyncMultiPartUpload", "ObjectNull");
    20. return null;
    21. }
    22. File file = new File(localFile);
    23. if (!file.exists()) {
    24. Log.w("AsyncMultiPartUpload", "FileNotExist");
    25. Log.w("LocalFile", localFile);
    26. return null;
    27. }
    28. Log.d("MultiPartUpload", localFile);
    29. PauseableUploadTask task = multiPartUploadManager.asyncUpload(object, localFile, userCallback, userProgressCallback);
    30. return task;
    31. }
本文导读目录
本文导读目录
以上内容是否对您有帮助?