如何获取 Amazon S3 对象的对象 URL
How Do I get Object URL for Amazon S3 object
我上传了一个文件到我的 Amazon S3 存储桶,我想使用 aws-SDK 而非控制台获取我放入的对象的 url。该对象已 public 读取使用权
我试过使用
const url = s3Client.getSignedUrl('getObject', {
Bucket: srcBucket,
Key: key,
});
但这会生成一个已签名的 url 过期。我似乎找不到任何其他方法来获取 url。非常感谢任何帮助。
您可以使用 Java V2 的 AWS 开发工具包获取 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]
}
以防万一有人遇到类似的问题,就像评论中提到的人一样,截至本文撰写之日,没有任何 API 可以在没有签名的情况下获得 s3 url除了你自己建造它。但是,我发现以下解决方案实施起来既快捷又容易。
const signedUrl = s3Client.getSignedUrl('getObject', {
Bucket: srcBucket,
Key: key,
});
signedUrl
returns 这种格式:
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),您可以通过 "?"
查询分隔符和 return 与第一个相同的元素拆分字符串对象 url.
const url = signedUrl.split('?')[0];
// https://{org}.s3.us-west-2.amazonaws.com/{PATH}/13592c51-d504-4899-960a-04efa0a7f6b7.mp3
唯一的考虑是 AWS 将来是否会更改 s3 对象 url 的显示方式。
我上传了一个文件到我的 Amazon S3 存储桶,我想使用 aws-SDK 而非控制台获取我放入的对象的 url。该对象已 public 读取使用权 我试过使用
const url = s3Client.getSignedUrl('getObject', {
Bucket: srcBucket,
Key: key,
});
但这会生成一个已签名的 url 过期。我似乎找不到任何其他方法来获取 url。非常感谢任何帮助。
您可以使用 Java V2 的 AWS 开发工具包获取 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]
}
以防万一有人遇到类似的问题,就像评论中提到的人一样,截至本文撰写之日,没有任何 API 可以在没有签名的情况下获得 s3 url除了你自己建造它。但是,我发现以下解决方案实施起来既快捷又容易。
const signedUrl = s3Client.getSignedUrl('getObject', {
Bucket: srcBucket,
Key: key,
});
signedUrl
returns 这种格式:
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),您可以通过 "?"
查询分隔符和 return 与第一个相同的元素拆分字符串对象 url.
const url = signedUrl.split('?')[0];
// https://{org}.s3.us-west-2.amazonaws.com/{PATH}/13592c51-d504-4899-960a-04efa0a7f6b7.mp3
唯一的考虑是 AWS 将来是否会更改 s3 对象 url 的显示方式。