开发者社区 问答 正文

如何实现上传文件(二)?


具体代码
生成一个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;
}


展开
收起
青衫无名 2017-10-18 10:30:50 1454 分享 版权
阿里云 AI 助理回答

从您的描述来看,您正在使用Android开发环境,并且涉及到文件上传功能,特别是利用了断点续传技术来提升大文件上传的稳定性和用户体验。这里有几个关键点和建议,帮助您更好地理解和优化这段代码:

1. Button控件创建

res/layout/content_main.xml中,您已经成功定义了一个Button控件,用于触发文件选择和上传操作。确保@string/multipart_upload在对应的字符串资源文件(如strings.xml)中有相应的文本定义。

2. 文件选择

通过Intent.ACTION_PICK启动系统文件选择器,限制为图片类型,这是正确的做法。不过,请注意处理RESULT_PAUSEABLEUPLOAD_IMAGE这个请求码,在onActivityResult方法中获取用户选择的文件并进行后续处理。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == RESULT_PAUSEABLEUPLOAD_IMAGE && resultCode == RESULT_OK && data != null) {
        Uri selectedImage = data.getData();
        // 这里可以将Uri转换为实际路径或直接使用,然后调用上传逻辑
    }
}

3. 断点续传实现

  • 您提到的ossService.asyncMultiPartUpload方法调用展示了如何利用OSS SDK(阿里云对象存储服务的SDK)异步执行分片上传。这是一个很好的实践,因为它允许大文件被分割成多个小块上传,提高上传成功率和速度。

  • PauseableUploadTask task变量用来跟踪上传任务,这使得暂停和恢复上传成为可能。确保在应用的生命周期管理中正确处理这个任务,比如在Activity或Fragment的onPauseonResumeonDestroy中适当取消或恢复任务,以避免内存泄漏或不必要的网络操作。

4. 底层封装逻辑

  • multiPartUploadManager.asyncUpload方法中,确保对异常情况有充分的处理,比如文件不存在或网络问题等,这样可以提供更健壮的错误处理机制给用户。

  • 断点续传的核心在于记录上传进度并在中断后能从上次断点继续,这通常需要依赖于OSS SDK内部维护的状态信息,比如upload ID等。确保这些状态信息在应用重启后也能被正确恢复,可能需要借助本地存储(SharedPreferences或数据库)来持久化这些数据。

总结

您的代码片段覆盖了从UI设计到后台服务调用的关键步骤,实现了基本的文件选择和断点续传上传功能。为了进一步提升应用的稳定性和用户体验,建议关注错误处理、应用生命周期管理以及用户反馈的设计。同时,深入理解所使用的OSS SDK文档,以便充分利用其提供的高级特性和最佳实践。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: