【问题标题】:How Do I get Object URL for Amazon S3 object如何获取 Amazon S3 对象的对象 URL
【发布时间】:2022-02-20 16:45:39
【问题描述】:

我将一个文件上传到我的 Amazon S3 存储桶,我想使用 aws-SDK 而不是控制台获取我放入的对象的 URL。该对象具有公共读取访问权限 我试过使用

const url = s3Client.getSignedUrl('getObject', {
        Bucket: srcBucket,
        Key: key,
    });

但这会生成一个过期的签名 url。我似乎找不到任何其他方法来获取网址。非常感谢任何帮助。

【问题讨论】:

  • 我不知道API,一般来说,你可以自己构建它:https://<bucket>.s3.<region>.amazonaws.com/<key>https://s3.<region>.amazonaws.com/<bucket>/<key>,如果你的bucket名称在域名中有句点或其他无效字符。跨度>
  • 查看 Julian 的答案 转到此处:stackoverflow.com/a/64156936/495455
  • 这能回答你的问题吗? Python 3 Boto 3, AWS S3: Get object URL

标签: amazon-web-services amazon-s3 url aws-sdk


【解决方案1】:

您可以使用 AWS SDK for Java V2 获取 Amazon S3 对象的 URL。代码如下:

// snippet-start:[s3.java2.getobjecturl.import]
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetUrlRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import java.net.URL;
// snippet-end:[s3.java2.getobjecturl.import]

public class GetObjectUrl {


    public static void main(String[] args) {

        final String USAGE = "\n" +
                "Usage:\n" +
                "    <bucketName> <keyName> \n\n" +
                "Where:\n" +
                "    bucketName - the Amazon S3 bucket name.\n\n"+
                "    keyName - a key name that represents the object. \n\n";

        if (args.length != 2) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String bucketName =  args[0];
        String keyName = args[1];
        Region region = Region.US_EAST_1 ;
        S3Client s3 = S3Client.builder()
                .region(region)
                .build();

        getURL(s3,bucketName,keyName);
        s3.close();
    }


    // snippet-start:[s3.java2.getobjecturl.main]
    public static void getURL(S3Client s3, String bucketName, String keyName ) {

        try {

            GetUrlRequest request = GetUrlRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .build();

            URL url = s3.utilities().getUrl(request);
            System.out.println("The URL for  "+keyName +" is "+url.toString());

        } catch (S3Exception e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
    // snippet-end:[s3.java2.getobjecturl.main]
}

【讨论】:

  • Property 'getObjectUrl' does not exist on type 'S3'. 尝试使用该方法时出现此错误。它不存在。我也在使用适用于 javascript 的 aws-sdk。
【解决方案2】:

以防万一有人遇到类似的问题,就像评论中提到的人一样,截至本文撰写之日,没有任何 API 可以在没有签名的情况下获取 s3 url,除非您自己构建它。但是,我发现以下解决方案既快速又易于实施。

const signedUrl = s3Client.getSignedUrl('getObject', {
    Bucket: srcBucket,
    Key: key,
});

signedUrl 以这种格式返回:

https://{org}.s3.us-west-2.amazonaws.com/{PATH}/13592c51-d504-4899-960a-04efa0a7f6b7.mp3?AWSAccessKeyId={AWSKEY}&Expires={EPOC DATE}&Signature={RANDOMKEY-amz-security-}token=RANDOM&TOKEN}

要获得一个未签名的 url (s3 Object url),您可以通过 "?" 查询分隔符拆分字符串并返回与 Object url 相同的第一个元素。

const url = signedUrl.split('?')[0];
// https://{org}.s3.us-west-2.amazonaws.com/{PATH}/13592c51-d504-4899-960a-04efa0a7f6b7.mp3

唯一的考虑是 AWS 是否会在未来改变 s3 对象 url 的显示方式。

【讨论】:

    猜你喜欢
    • 2018-09-24
    • 1970-01-01
    • 2018-11-01
    • 2020-01-18
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多