代码片段呈现了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
通过这种方式,你可以清晰地看到文件上传的进度和耗时,方便监控和调试。