当我的代码尝试上传到 AWS S3 时,我遇到了问题。目前,许多尝试因以下错误而失败:
原因:com.amazonaws.ResetException:对服务的请求因可重试原因而失败,但重置请求输入流失败。请参阅 exception.getExtraInfo 或调试级别日志记录,了解导致此重试的原始故障。如果请求涉及输入流,可以通过 request.getRequestClientOptions().setReadLimit(int) 配置最大流缓冲区大小
查看 AWS 文档以避免 ResetExceptions,其中指出最佳实践是“使用 File 或 FileInputStream 提供数据”。在代码中,我使用的是 FileInputStream 扩展的 InputStream。将类型从 InputStream 更改为 FileInputStream 会有什么不同吗?
我的替代选择是setReadLimit,但想知道上述更改是否足够。谢谢!
基于您的异常:
com.amazonaws.ResetException
我可以看到您正在使用 AWS SDK for Java V1。这是不好的做法,这个 SDK 版本即将被弃用。参见:
宣布终止对适用于 Java 的 AWS 开发工具包 v1.x 的支持,自 2025 年 12 月 31 日起生效
使用适用于 Java V2 的 AWS 开发工具包上传文件的最佳实践是使用 Transfer Manager。
请参阅此处的文档:
使用 Amazon S3 Transfer Manager 传输文件和目录
这是代码示例:
package com.example.s3.transfermanager;
// snippet-start:[s3.tm.java2.uploadfile.import]
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload;
import software.amazon.awssdk.transfer.s3.model.FileUpload;
import software.amazon.awssdk.transfer.s3.model.UploadFileRequest;
import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener;
import java.net.URL;
import java.nio.file.Paths;
import java.util.UUID;
// snippet-end:[s3.tm.java2.uploadfile.import]
/**
* Before running this Java V2 code example, set up your development
* environment, including your credentials.
*
* For more information, see the following documentation topic:
*
* https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
*/
public class UploadFile {
private static final Logger logger = LoggerFactory.getLogger(UploadFile.class);
public final String bucketName = "x-" + UUID.randomUUID();
public final String key = UUID.randomUUID().toString();
public String filePath;
public UploadFile() {
this.setUp();
}
public static void main(String[] args) {
UploadFile upload = new UploadFile();
upload.uploadFile(S3ClientFactory.transferManager, upload.bucketName, upload.key, upload.filePath);
upload.cleanUp();
}
// snippet-start:[s3.tm.java2.uploadfile.main]
public String uploadFile(S3TransferManager transferManager, String bucketName,
String key, String filePath) {
UploadFileRequest uploadFileRequest = UploadFileRequest.builder()
.putObjectRequest(b -> b.bucket(bucketName).key(key))
.addTransferListener(LoggingTransferListener.create())
.source(Paths.get(filePath))
.build();
FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest);
CompletedFileUpload uploadResult = fileUpload.completionFuture().join();
return uploadResult.response().eTag();
}
// snippet-end:[s3.tm.java2.uploadfile.main]
private void setUp() {
S3ClientFactory.s3Client.createBucket(b -> b.bucket(bucketName));
// get the file system path to the provided file to upload
URL resource = UploadFile.class.getClassLoader().getResource("image.png");
filePath = resource.getPath();
}
public void cleanUp() {
S3ClientFactory.s3Client.deleteObject(b -> b.bucket(bucketName).key(key));
S3ClientFactory.s3Client.deleteBucket(b -> b.bucket(bucketName));
}
}