想要使用预签名网址将文件上传到s3存储桶

时间:2015-06-11 07:21:45

标签: java amazon-web-services amazon-s3

我无法使用预先签名的网址上传图片。我正在关注amazon java代码,但它无法正常工作。

我的要求如下 我在亚马逊XYZBucket上创建了存储桶,我的存储桶是空的。 我充当服务器,为用户提供预先分配的URL,用户将使用此URL上传图像。

生成预签名网址的代码

AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());
        URL url = null;

        try {
            java.util.Date expiration = new java.util.Date();
            long milliSeconds = expiration.getTime();
            milliSeconds += 1000 * 60 * 60 * 12; // Add 1 hour.
            expiration.setTime(milliSeconds);

            GeneratePresignedUrlRequest generatePresignedUrlRequest = 
                    new GeneratePresignedUrlRequest(bucketName, objectKey);
            generatePresignedUrlRequest.setMethod(HttpMethod.GET); 
            generatePresignedUrlRequest.setExpiration(expiration);

            url = s3client.generatePresignedUrl(generatePresignedUrlRequest); 

        } catch (AmazonServiceException exception) {

        } catch (AmazonClientException ace) {

        }
        return url.toString();

我也使用put方法

AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); 

        java.util.Date expiration = new java.util.Date();
        long msec = expiration.getTime();
        msec += 1000 * 60 * 60; // Add 1 hour.
        expiration.setTime(msec);

        GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectKey);
        generatePresignedUrlRequest.setMethod(HttpMethod.PUT); 
        generatePresignedUrlRequest.setExpiration(expiration);

        URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
        return url.toString()

我的bucketName和objectkey是

XYZBucketfile1

当我点击浏览器中的网址时,它会给我

SignatureDoesNotMatch 

错误。

任何人都可以帮助我使用预先签名的网址将文件上传到s3存储桶吗?

2 个答案:

答案 0 :(得分:2)

根据AWS documentation,您应该使用" PUT"创建"上传"的方法URL。然后用户将制作一个" PUT"请求此URL上传其文件。

在浏览器中点击此网址即可获得" GET"请求,但签名包含" PUT"所以它会引发SignatureDoesNotMatch错误。

答案 1 :(得分:0)

根据AWS S3文档Signing and Authenticating REST request,S3现在默认使用SignatureVersion4。

但是,默认情况下,AWS-SDK使用的是SignatureVersion2。

所以我们必须在请求标头中明确指定SignatureVersion4