星驰编程网

免费编程资源分享平台_编程教程_代码示例_开发技术文章

对象存储oos实现上传文件进度条(对象存储oos适用于以下哪些场景)

代码片段呈现了SDK for Java将文件上传至存储桶的方法,同时借助进度监听器(ProgressListener)实时输出上传进度。特别是在处理大型文件时,能够实时掌握上传进度,很有实用价值。

  • 完整代码逻辑总结
  • 初始化 S3 客户端:在 main 方法中初始化 AmazonS3 客户端。
  • 设置文件路径和目标信息:指定要上传的文件路径和目标 S3 桶名。
  • 构建上传请求:创建 PutObjectRequest 对象,指定文件和目标信息。
  • 设置进度监听器:通过 ProgressListener 实时监听上传进度,并打印进度信息。
  • 执行上传操作:调用 client.putObject(request) 方法上传文件,并捕获异常。
  • 计算并打印上传耗时:记录上传操作的总耗时。
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ProgressEvent;
import com.amazonaws.services.s3.model.ProgressListener;
import com.amazonaws.services.s3.model.PutObjectRequest;

import java.io.File;

public class S3UploadWithProgress {
    private static final String bucketName = "your-bucket-name";

    public static void main(String[] args) {
        AmazonS3 client = // 初始化你的 S3 客户端
        putObjectWithProgress(client);
    }

    private static void putObjectWithProgress(AmazonS3 client) {
        String path = "C:\\Users\\Desktop\\1.txt";
        long start = System.currentTimeMillis();
        File file = new File(path);

        long totalBytes = file.length();
        PutObjectRequest request = new PutObjectRequest(bucketName, "1.txt", file);
        ProgressListener pl = new ProgressListener() {
            @Override
            public void progressChanged(ProgressEvent progressEvent) {
                long bytesTransferred = progressEvent.getBytesTransfered();
                double progressPercentage = (bytesTransferred * 100.0) / totalBytes;
                System.out.printf("已传输: %d 字节, 进度: %.2f%%\n", bytesTransferred, progressPercentage);
            }
        };
        request.setProgressListener(pl);

        try {
            client.putObject(request);
            System.out.println("上传完成!");
        } catch (AmazonServiceException e) {
            e.printStackTrace();
            System.err.println("上传失败: " + e.getErrorMessage());
        } catch (SdkClientException e) {
            e.printStackTrace();
            System.err.println("客户端异常: " + e.getMessage());
        }

        System.out.println("&&& 持续时间 " + (System.currentTimeMillis() - start) + " ms");
    }
}

代码解释

1. 导入必要的包

import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ProgressEvent;
import com.amazonaws.services.s3.model.ProgressListener;
import com.amazonaws.services.s3.model.PutObjectRequest;
import java.io.File;
  • com.amazonaws.AmazonServiceException:AWS SDK 抛出的异常,表示服务端错误(如权限不足、资源不存在等)。
  • com.amazonaws.SdkClientException:AWS SDK 抛出的异常,表示客户端错误(如网络问题、无效的请求参数等)。
  • com.amazonaws.services.s3.AmazonS3:AWS S3 客户端类,用于与 S3 服务交互。
  • com.amazonaws.services.s3.model.ProgressEvent:表示上传或下载过程中的进度事件。
  • com.amazonaws.services.s3.model.ProgressListener:监听进度事件的接口。
  • com.amazonaws.services.s3.model.PutObjectRequest:用于构建上传请求的类。
  • java.io.File:Java 标准库中的类,用于表示文件和目录路径。

2. 定义常量

private static final String bucketName = "your-bucket-name";
  • 这里定义了一个常量 bucketName,表示目标 S3 桶的名称。你需要将其替换为实际的 S3 桶名。

3. 主方法

public static void main(String[] args) {
AmazonS3 client = // 初始化你的 S3 客户端
putObjectWithProgress(client);
}
  • AmazonS3 client:AWS S3 客户端实例,用于与 S3 服务进行通信。你需要在这里初始化 S3 客户端,通常通过 AmazonS3ClientBuilder 来完成。
  • putObjectWithProgress(client):调用 putObjectWithProgress 方法,将文件上传到 S3,并显示上传进度。

4. 上传文件并显示进度

private static void putObjectWithProgress(AmazonS3 client) {
String path = "C:\\Users\\Desktop\\1.txt";
long start = System.currentTimeMillis();
File file = new File(path);
  • String path:定义了要上传的文件路径。
  • long start:记录上传操作开始的时间,用于计算上传耗时。
  • File file:通过 File 类表示要上传的文件。

5. 计算总字节数

long totalBytes = file.length();
  • 获取文件的总字节数,用于后续计算上传进度百分比。

6. 构建上传请求

PutObjectRequest request = new PutObjectRequest(bucketName, "1.txt", file);
  • 创建一个 PutObjectRequest 对象,指定目标 S3 桶名(bucketName)、目标对象的键("1.txt")和要上传的文件(file)。

7. 设置进度监听器

ProgressListener pl = new ProgressListener() {
@Override
public void progressChanged(ProgressEvent progressEvent) {
long bytesTransferred = progressEvent.getBytesTransfered();
double progressPercentage = (bytesTransferred * 100.0) / totalBytes;
System.out.printf("已传输: %d 字节, 进度: %.2f%%\n", bytesTransferred, progressPercentage);
}
};
request.setProgressListener(pl);
  • 创建一个匿名类实现 ProgressListener 接口。
  • 在 progressChanged 方法中:
  • 获取已传输的字节数(progressEvent.getBytesTransfered())。
  • 计算进度百分比(bytesTransferred / totalBytes * 100)。
  • 使用 System.out.printf 打印进度信息,格式为:已传输: X 字节, 进度: Y.YY%。

8. 执行上传操作

try {
client.putObject(request);
System.out.println("上传完成!");
} catch (AmazonServiceException e) {
e.printStackTrace();
System.err.println("上传失败: " + e.getErrorMessage());
} catch (SdkClientException e) {
e.printStackTrace();
System.err.println("客户端异常: " + e.getMessage());
}
  • 调用 client.putObject(request) 方法,将文件上传到 S3。
  • 使用 try-catch 块捕获可能的异常:
  • AmazonServiceException:表示服务端错误,例如权限不足、桶不存在等。
  • SdkClientException:表示客户端错误,例如网络问题、无效的请求参数等。
  • 如果上传成功,打印 "上传完成!"。

9. 计算并打印上传耗时

System.out.println("&&& 持续时间 " + (System.currentTimeMillis() - start) + " ms");
  • 使用 System.currentTimeMillis() 计算上传操作的总耗时(单位为毫秒)。
  • 打印上传耗时。

输出示例

假设文件大小为 10MB,上传过程中可能会输出类似以下内容:

已传输: 1048576 字节, 进度: 10.00%
已传输: 2097152 字节, 进度: 20.00%
...
已传输: 10485760 字节, 进度: 100.00%
上传完成!
&&& 持续时间 5000 ms

通过这种方式,你可以清晰地看到文件上传的进度和耗时,方便监控和调试。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言