Android中如何获取AWS同存储桶内对象复制操作的进度?
解决AWS S3同一存储桶内复制文件的进度监控问题
刚好之前做过类似的需求,AWS S3的copyObject默认是同步执行且不提供进度反馈的,但我们可以通过TransferManager来实现进度监控——这是AWS专门用来处理大文件传输(包括复制)的工具类,能完美适配你的场景。
具体实现方案
下面是修改后的代码,核心是用TransferManager替代直接调用S3Client.copyObject,并添加进度监听器:
try { AmazonS3 s3Client = new AmazonS3Client(credentials, cc); // 初始化TransferManager,绑定你的S3客户端 TransferManager transferManager = TransferManagerBuilder.standard() .withS3Client(s3Client) .build(); // 构造复制请求(和你原来的一致) CopyObjectRequest copyObjRequest = new CopyObjectRequest( bucketName, sourceKey, "wedorias-new", "test/test111/logo.png" ); // 执行复制操作,获取Copy对象用于监控进度 Copy copyOperation = transferManager.copy(copyObjRequest); // 添加进度监听器,实时获取复制状态 copyOperation.addProgressListener(new ProgressListener() { @Override public void progressChanged(ProgressEvent progressEvent) { // 区分不同的进度事件类型 switch (progressEvent.getEventCode()) { case ProgressEvent.STARTED_EVENT_CODE: System.out.println("复制操作已启动"); break; case ProgressEvent.COMPLETED_EVENT_CODE: System.out.println("复制完成!"); break; case ProgressEvent.FAILED_EVENT_CODE: System.out.println("复制失败"); break; default: // 计算并输出实时进度 long transferred = progressEvent.getBytesTransferred(); long total = progressEvent.getBytesTotal(); if (total > 0) { double progress = (double) transferred / total * 100; System.out.printf("当前进度:%.2f%% (%d/%d 字节)%n", progress, transferred, total); } } } }); // 可选:如果你需要同步等待复制完成,调用这个方法 copyOperation.waitForCompletion(); // 用完记得关闭TransferManager,避免资源泄漏 transferManager.shutdownNow(); } catch (AmazonServiceException e) { e.printStackTrace(); System.out.println("S3服务端错误:"+e.getErrorMessage()); System.out.println("错误码:"+e.getErrorCode()); } catch (InterruptedException e) { e.printStackTrace(); System.out.println("复制操作被中断:"+e.getMessage()); } catch (Exception e) { e.printStackTrace(); System.out.println("未知错误:"+e.getMessage()); }
关键说明
- TransferManager的作用:它会自动处理S3的分块复制逻辑(比如大文件自动拆分),同时提供进度监控、异步执行等能力,比直接调用
copyObject更灵活。 - 进度监听器的细节:
ProgressEvent会返回不同的事件码,你可以根据需求处理启动、完成、失败等状态;对于实时进度,getBytesTransferred是已传输的字节数,getBytesTotal是总字节数。 - 小文件的特殊情况:如果复制的是小文件,S3会直接在服务端完成复制,此时进度会直接跳到100%,不会有逐步的进度更新——这是正常的,因为不需要客户端参与数据传输。
- 资源清理:使用完
TransferManager后一定要调用shutdownNow()关闭,避免占用不必要的资源。
内容的提问来源于stack exchange,提问作者Rishikesh Rahi
相关产品推荐
相关产品推荐

