You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:02:39