AWS-使用S3 TransferManager

时间:2018-08-09 14:58:13

标签: amazon-web-services amazon-s3 aws-lambda

我正在尝试使用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? 任何帮助将不胜感激。

0 个答案:

没有答案