我无法使用预先签名的网址上传图片。我正在关注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是
XYZBucket
和file1
当我点击浏览器中的网址时,它会给我
SignatureDoesNotMatch
错误。
任何人都可以帮助我使用预先签名的网址将文件上传到s3存储桶吗?
答案 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