如何为Amazon S3客户端设置区域?

4
我将尝试在Java网络应用程序中实现文件上传。当用户通过UI上传文件时,我希望它被存储在亚马逊S3存储中。
以下是我的后端代码:
@PostMapping("/upload-file")
public String saveFile(@RequestParam("name") String name, @RequestParam("file")MultipartFile file, RedirectAttributes redirectAttributes){

    AWSCredentials credentials = new BasicAWSCredentials("user", "psw");

    AmazonS3 s3Client = new AmazonS3Client(credentials);

    String bucketName = "kfib";

    s3Client.createBucket(bucketName);

    s3Client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.EU_WEST_1));


    ObjectMetadata md = new ObjectMetadata();
    md.setContentType("application/pdf");

// md.set

    try{
        InputStream inputStream = file.getInputStream();

        s3Client.putObject(new PutObjectRequest(bucketName, name, inputStream, md).withCannedAcl(CannedAccessControlList.PublicRead));

        S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucketName, name));

        log.info("Url of the image:\n");
        log.info(s3Object.getObjectContent().getHttpRequest().getURI().toString());

    }catch(IOException e){
        e.printStackTrace();
    }


    log.info("upload called with post method...");

    return "redirect:/admin/posts";
}

如果我将文件上传到默认区域,那么我可以上传两个文件。但是,我希望将我的文件存储在另一个服务器上。我在欧盟地区有一个存储桶,如果我尝试使用上述代码将文件上传到该存储桶,则会收到以下错误代码:

com.amazonaws.services.s3.model.AmazonS3Exception: The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-central-1' (Service: Amazon S3; Status Code: 400; Error Code: AuthorizationHeaderMalformed; Request ID: 8EF630B5F0224C4F)

看起来这一行

s3Client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.EU_WEST_1));

没有任何效果。我做错了什么吗?


1
AmazonS3Client.setRegion()已被弃用。你是否尝试使用AwsClientBuilder.setRegion(String)?请参考:http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/client/builder/AwsClientBuilder.html#setRegion-java.lang.String- - Roman Puchkovskiy
我可能错了,鉴于Java的标准乏味性,但是s3Client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.EU_WEST_1));似乎有点...多余。这不仅仅是s3Client.setRegion(Regions.EU_WEST_1)吗? - Michael - sqlbot
抱歉@rpuch,我显然花了超过5分钟来撰写我的评论,在你的评论面前有些多余...你的问题似乎比我的更好。 - Michael - sqlbot
我猜测您在上述代码中替换了传递给BasicAWSCredentials的AccessKey / SecretKey值以确保安全,而不是真正传递用户名和密码?值得检查它们是否正确,因为当访问密钥或秘密密钥无效时,调用AmazonS3Client.headBucket()可能会导致误导性错误。 - redbirdo
2个回答

8

我曾经遇到过同样的问题,但是以下方法对我有效 -

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();

如果我之前使用过这个:AmazonS3Client(AnonymousAWSCredentials()),那么我应该使用什么? - android developer
如果我之前用过这个:AmazonS3Client(AnonymousAWSCredentials()),那我应该使用什么? - undefined

2

全局桶访问

您可以将 withForceGlobalBucketAccessEnabled 标志设置为 true

例如

AmazonS3 s3client = AmazonS3ClientBuilder
            .standard()
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .withForceGlobalBucketAccessEnabled(true)
            .build();

很遗憾,SDK v2没有这个功能。 - Beethoven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接