AWS Java S3上传错误:";配置文件不能为空";

AWS Java S3上传错误:";配置文件不能为空";,java,amazon-s3,amazon,Java,Amazon S3,Amazon,当我试图从JavaSpring应用程序向AmazonS3上传文件时,我遇到了一个异常。方法非常简单: private void productionFileSaver(String keyName, File f) throws InterruptedException { String bucketName = "{my-bucket-name}"; TransferManager tm = new TransferManager(new ProfileCre

当我试图从JavaSpring应用程序向AmazonS3上传文件时,我遇到了一个异常。方法非常简单:

private void productionFileSaver(String keyName, File f) throws InterruptedException {

        String bucketName = "{my-bucket-name}";
        TransferManager tm = new TransferManager(new ProfileCredentialsProvider());        
        // TransferManager processes all transfers asynchronously, 
        // so this call will return immediately.
        Upload upload = tm.upload(
                bucketName, keyName, new File("/mypath/myfile.png"));

        try {
            // Or you can block and wait for the upload to finish
            upload.waitForCompletion();
            System.out.println("Upload complete.");
        } catch (AmazonClientException amazonClientException) {
            System.out.println("Unable to upload file, upload was aborted.");
            amazonClientException.printStackTrace();
        }
    }
这与amazon提供的基本相同,并且在尝试版本时,会出现完全相同的异常消息(“概要文件不能为null”)。 这个问题与文件不存在或为null无关(我已经用一千种方法检查了
TransferManager.upload
方法在调用它之前是否存在file参数)

我找不到有关我的异常消息“配置文件不能为空”的任何信息。错误日志的第一行如下所示:

com.amazonaws.AmazonClientException: Unable to complete transfer: profile file cannot be null
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.unwrapExecutionException(AbstractTransfer.java:281)
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.rethrowExecutionException(AbstractTransfer.java:265)
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.waitForCompletion(AbstractTransfer.java:103)
    at com.fullteaching.backend.file.FileController.productionFileSaver(FileController.java:371)
    at com.fullteaching.backend.file.FileController.handlePictureUpload(FileController.java:247)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
我的S3策略允许为所有类型的用户获取和放置对象


你知道发生了什么吗?

解决方案非常简单:我试图在没有AmazonS3 bean的情况下为Spring实现这种通信

此链接将有助于配置:

创建新的配置文件凭据提供程序,该提供程序返回为默认配置文件配置的AWS安全凭据

所以,如果您在
~/.aws/credentials
中没有任何默认配置文件的配置,那么在尝试放置对象时,它会产生该错误

如果在Lambda服务上运行代码,它将不会提供此文件。在这种情况下,您也不需要提供凭据。只需将正确的IAM角色分配给lambda函数,然后使用默认构造函数就可以解决这个问题


您可能需要根据需要更改构造函数

我的代码运行良好,如下所示:

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(DefaultAWSCredentialsProviderChain.getInstance()).withRegion(clientRegion).build();

谢谢在
Lambda
中,我将
ProfileCredentialsProvider
传递给构造函数,这导致了错误。使用
AmazonS3Client=newamazons3client()works.FYI-我在docker ECS容器中遇到此问题。这和Lambda是一样的。在您的代码中查找新的ProfileCredentialsProvider(someProfile))
并将其替换为
DefaultAWSCredentialsProviderChain.getInstance()
我在这里留下了一个带有代码示例的答案:这对我不起作用。当我选中DefaultAWSCredentialsProviderChain.getInstance()时,正在创建一个新的ProfileCredentialsProvider,这可能导致了问题。不确定。仍然没有收到任何回音