簡體   English   中英

AWS Java SDK 2.0 S3 預簽名 URL 公共 object 訪問

[英]AWS Java SDK 2.0 S3 presigned URL public object access

為文件上傳本身創建預簽名 url 工作正常。 但是默認情況下通過生成的 URL 上傳文件會使它成為私有的,因此不能通過它的 URL 訪問

我必須手動將 go 發送到控制台並公開文件以便從它的 URL 訪問

這是我的代碼

String bucketName = "<bucket-name>";
String keyName = "<file-name>";

S3Presigner presigner = S3Presigner.builder().region(Region.AP_SOUTH_1).build();

PutObjectRequest objectRequest = PutObjectRequest.builder()
        .bucket(bucketName)
        .key(keyName)
        .build();

PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
        .signatureDuration(Duration.ofMinutes(3))
        .putObjectRequest(objectRequest)
        .build();

PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);

System.out.println("Pre-signed URL to upload a file to: " +
        presignedRequest.url());
System.out.println("Which HTTP method needs to be used when uploading a file: " +
        presignedRequest.httpRequest().method());   

presigner.close();

在 NodeJs 中,我們指定我們希望該文件可公開訪問,所以我發現它是 java sdk 等價物,如下所示

PutObjectRequest objectRequest = PutObjectRequest.builder()
        .bucket(bucketName)
        .key(keyName)
        .acl(ObjectCannedACL.PUBLIC_READ)
        .build();

但是當通過由此生成的 URL 上傳時,出現簽名不匹配錯誤

The request signature we calculated does not match the signature you provided. Check your key and signing method

我究竟做錯了什么? 使文件可公開訪問不是正確的方法嗎? 如果沒有,我應該怎么做?

我在 AWS 的 github 上針對 java-sdk 發布了同樣的問題並找到了解決方案。

.acl(ObjectCannedACL.PUBLIC_READ)將在PutObjectRequest.builder()中添加x-amz-acl ,而不是在需要它的查詢中

這是將其添加到查詢中的方法

AwsRequestOverrideConfiguration override = AwsRequestOverrideConfiguration.builder()
        .putRawQueryParameter("x-amz-acl", "private")
        .build();

PutObjectRequest putObjectRequest = PutObjectRequest.builder()
        .bucket(bucketName)
        .key(keyName)
        .overrideConfiguration(override)
        .build();

該解決方案完美無缺。 認為它也可能對其他人有幫助

有關詳細信息,請參閱github

這應該可以解決問題:

new PutObjectRequest("xxx", "xxx, fis, metadata).withCannedAcl(CannedAccessControlList.PublicRead));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM