首页 > 解决方案 > AWS - 使用 S3 TransferManager 生成预签名 URL

问题描述

我正在尝试为我使用 S3 TransferManager 上传到 s3 存储桶的数据对象生成一个预签名的 url。但我收到以下错误

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>NoSuchKey</Code>
    <Message>The specified key does not exist.</Message>
    <Key>mykey</Key>
    <RequestId>9BB78BBE144063EA</RequestId>
    <HostId>myhostid</HostId>
</Error>

如果我使用 com.amazonaws.services.s3.AmazonS3 上传我的数据对象,我可以成功生成预签名的 url。但是我想使用 TransferManager,因为与 AmazonS3 相比,上传性能要好得多(在我的情况下接近 100 倍)这是给我上述错误的代码

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                            .withRegion(region.getName())
                            .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                            .build();
    TransferManager manager = TransferManagerBuilder
                                .standard()
                                .withS3Client(s3Client)
                                .build();
    byte[] zippedBytes = compressLayers(layers); //here the compressed json is got
    ObjectMetadata metaData = new ObjectMetadata();
    metaData.setContentType(CONTENT_TYPE_JSON);
    metaData.setContentEncoding(CONTENT_ENCODING_GZIP);
    metaData.setContentLength(zippedBytes.length);
    manager.upload(bucketName, uuidFileName, new ByteArrayInputStream(zippedBytes), metaData);
    java.util.Date expiration = new Date(new Date().getTime()+1000*60*2);
    GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, uuidFileName)
                                        .withMethod(HttpMethod.GET)
                                        .withExpiration(expiration);
    URL url = s3Client.generatePresignedUrl(req);

在上面的代码中,如果我使用 s3Client 上传数据对象,

s3Client.putObject(bucketName, uuidFileName, new ByteArrayInputStream(zippedBytes), metaData);

然后它会正确返回预签名的 url。还有什么方法可以使用 TransferManager 生成预签名的 url?任何帮助将不胜感激。

标签: amazon-web-servicesamazon-s3aws-lambda

解决方案


推荐阅读