如何获取Amazon S3对象的对象URL

4
我已将文件上传到我的Amazon S3存储桶中,并希望使用aws-SDK获取该对象的URL,而不是在控制台中寻找。该对象具有公共读取权限。我尝试过使用以下方式:
const url = s3Client.getSignedUrl('getObject', {
        Bucket: srcBucket,
        Key: key,
    });

但是那会生成一个过期的签名URL。我似乎找不到其他获取仅URL的方法。非常感谢任何帮助。


1
我不知道有没有API,通常情况下,你可以自己构建它:https://<bucket>.s3.<region>.amazonaws.com/<key> 或者 https://s3.<region>.amazonaws.com/<bucket>/<key> 如果你的存储桶名称中包含了在域名中无效的句号或其他字符。 - Anon Coward
请查看Julian Go在此处的回答:https://dev59.com/2FYM5IYBdhLWcg3wnBFY#64156936 - Jeremy Thompson
这个回答是否解决了你的问题?Python 3 Boto 3,AWS S3:获取对象URL - Jeremy Thompson
2个回答

3

以防万一有人遇到类似的问题,就像评论中提到的那样,在这篇文章写作时还没有任何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对象url),您可以通过 "?" 查询分隔符拆分字符串,并返回与对象url相同的第一个元素。

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

唯一需要考虑的是,如果AWS在未来更改s3对象URL的显示方式。

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]
}

当我尝试使用该方法时,出现了“类型'S3'上不存在'getObjectUrl'属性”的错误。该方法不存在。同时,我正在使用JavaScript的aws-sdk。 - sirATL

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