简体   繁体   English

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

[英]AWS Java S3 Uploading error: “profile file cannot be null”

I get an exception when trying to upload a file to Amazon S3 from my Java Spring application. 尝试从Java Spring应用程序上传文件到Amazon S3时出现异常。 The method is pretty simple: 方法很简单:

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();
        }
    }

It is basically the same that amazon provides here , and the same exception with the exactly same message ("profile file cannot be null") appears when trying this other version. 这与amazon 在此处提供的基本相同,并且在尝试此其他版本时会出现完全相同的消息(“配置文件不能为空”)的相同异常。 The problem is not related to the file not existing or being null (I have already checked in a thousand ways that the File argument recieved by TransferManager.upload method exists before calling it). 该问题与文件不存在或为空无关(我已经检查过一千种方式,在调用它之前存在TransferManager.upload方法收到的File参数)。

I cannot find any info about my exception message " profile file cannot be null ". 我找不到有关我的异常消息的任何信息“ 配置文件不能为空 ”。 The first lines of the error log are the following: 错误日志的第一行如下:

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)

My S3 policy allows getting and puttings objects for all kind of users. 我的S3策略允许为所有类型的用户获取和放置对象。

Any idea about what's happening? 关于发生了什么的任何想法?

ProfileCredentialsProvider() creates a new profile credentials provider that returns the AWS security credentials configured for the default profile. ProfileCredentialsProvider()创建新的配置文件凭据提供程序,该提供程序返回为默认配置文件配置的AWS安全凭证。

So, if you haven't any configuration for default profile at ~/.aws/credentials , while trying to put object, it yields that error. 因此,如果您在~/.aws/credentials没有任何默认配置文件配置,则在尝试放置对象时会产生该错误。

If you run your code on Lambda service, it will not provide this file. 如果您在Lambda服务上运行代码,它将不提供此文件。 In that case, you also do not need to provide credentials. 在这种情况下,您也不需要提供凭据。 Just assign right IAM Role to your lambda function, then using default constructor should solve issue. 只需将正确的IAM角色分配给lambda函数,然后使用默认构造函数来解决问题。

You may want to change TransferManager constructor according to your needs. 您可能希望根据需要更改TransferManager构造函数。

The solution was pretty simple: I was trying to implement this communication without an AmazonS3 bean for Spring. 解决方案非常简单:我试图在没有适用于Spring的AmazonS3 bean的情况下实现此通信。

This link will help with the configuration: 此链接将有助于配置:

http://codeomitted.com/upload-file-to-s3-with-spring/ http://codeomitted.com/upload-file-to-s3-with-spring/

我的代码工作正常如下:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM