java - 如何将文件上传到 AWS S3 Bucket?

标签 java amazon-web-services amazon-s3

我正在创建一个简单的应用程序,我想在其中将文件上传到我的 AWS S3 存储桶。这是我的代码:

import java.io.File;
import java.io.IOException;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.fasterxml.jackson.*;

public class UploadFileInBucket {

    public static void main(String[] args) throws IOException {
        String clientRegion = "<myRegion>";
        String bucketName = "<myBucketName>";
        String stringObjKeyName = "testobject";
        String fileObjKeyName = "testfileobject";
        String fileName = "D:\\Attachments\\LICENSE";

        try {

            BasicAWSCredentials awsCreds = new BasicAWSCredentials("<myAccessKey>", "<mySecretKey>");
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                    .build();

            // Upload a text string as a new object.
            s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");

            // Upload a file as a new object with ContentType and title specified.
            PutObjectRequest request = new PutObjectRequest(bucketName, fileObjKeyName, new File(fileName));
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType("plain/text");
            metadata.addUserMetadata("x-amz-meta-title", "someTitle");
            request.setMetadata(metadata);
            s3Client.putObject(request);
        }
        catch(AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        }
        catch(SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}

我无法上传文件并收到如下错误:

Exception in thread "main" java.lang.NoSuchFieldError: 

    ALLOW_FINAL_FIELDS_AS_MUTATORS
        at com.amazonaws.partitions.PartitionsLoader.<clinit>(PartitionsLoader.java:52)
        at com.amazonaws.regions.RegionMetadataFactory.create(RegionMetadataFactory.java:30)
        at com.amazonaws.regions.RegionUtils.initialize(RegionUtils.java:64)
        at com.amazonaws.regions.RegionUtils.getRegionMetadata(RegionUtils.java:52)
        at com.amazonaws.regions.RegionUtils.getRegion(RegionUtils.java:105)
        at com.amazonaws.client.builder.AwsClientBuilder.getRegionObject(AwsClientBuilder.java:249)
        at com.amazonaws.client.builder.AwsClientBuilder.withRegion(AwsClientBuilder.java:238)
        at UploadFileInBucket.main(UploadFileInBucket.java:28)

我已经添加了执行此代码所需的 AWS 存储桶凭证、权限和依赖项。

我应该对代码进行哪些更改才能将我的文件上传到所需的存储桶?

最佳答案

看起来您的 Jackson 库版本有误,或者以某种方式链接了它们的多个版本。

AWS for Java SDK 分发包含一个 third-party/lib 目录,其中包含构建 SDK 版本时应使用的所有(正确版本)库。根据您使用的 SDK 的哪些功能,您可能不需要所有这些功能,但这些是您应该使用的特定第 3 方库。

关于java - 如何将文件上传到 AWS S3 Bucket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50734610/

相关文章:

java - 安装到 Maven 中的另一个本地存储库 [JAVA]

java - 如何删除 JSP 标签后的换行符?

amazon-web-services - 使用 CloudFormation 为 APIGateway 提供适当的子域

javascript - 是否可以通过 CloudFront CDN 进行 AWS 内容路由?

java - DXF 文件插入实体

Java用'(撇号/单引号)和\(反斜杠)一起替换问题

angularjs - 如何使用nodejs/angular删除Amazon s3文件

amazon-web-services - Amazon Hive 中的多分隔符 SerDe 设置

amazon-web-services - S3存储: Make a bucket folder private

.net - ASP.NET Core 2 Web API AWS .NET SDK S3 访问被拒绝