Amazon S3 文件上传中 ResetExceptions 的 FileInputStream 与 InputStream

问题描述 投票:0回答:1

当我的代码尝试上传到 AWS S3 时,我遇到了问题。目前,许多尝试因以下错误而失败:

原因:com.amazonaws.ResetException:对服务的请求因可重试原因而失败,但重置请求输入流失败。请参阅 exception.getExtraInfo 或调试级别日志记录,了解导致此重试的原始故障。如果请求涉及输入流,可以通过 request.getRequestClientOptions().setReadLimit(int) 配置最大流缓冲区大小

查看 AWS 文档以避免 ResetExceptions,其中指出最佳实践是“使用 File 或 FileInputStream 提供数据”。在代码中,我使用的是 FileInputStream 扩展的 InputStream。将类型从 InputStream 更改为 FileInputStream 会有什么不同吗?

我的替代选择是setReadLimit,但想知道上述更改是否足够。谢谢!

amazon-web-services amazon-s3 inputstream fileinputstream
1个回答
0
投票

基于您的异常:

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));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.