将图像上传到Amazon S3存储桶。我需要从亚马逊服务器获取预先签名的网址。我还想设置该URL的到期时间。最多只需17天。但是我不能设置最长1年的到期时间。
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 1);
Date nextYear = cal.getTime();
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(
"bucketName", "accessname");
generatePresignedUrlRequest.setMethod(HttpMethod.GET);
generatePresignedUrlRequest
.setExpiration(nextYear);
URL url = s3client
.generatePresignedUrl(generatePresignedUrlRequest);
bucketURL = url.toString();
答案 0 :(得分:15)
您没有“从服务器”获取预先签名的网址。签名计算在客户端完成。预先签名的网址实际上是在您的计算机上计算的,而不是由服务计算的。
如果您使用的是当前的SDK,则可能使用的是Signature V4。如果签名的网址包含X-Amz-Signature=
,则此确认V4。较旧的V2算法仅在签名URL中使用Signature=
。
如果您的签名确实是V4,那么您会看到故意限制:
预签名网址的有效期最长为七天,因为您在签名计算中使用的签名密钥有效期最长为七天。
http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
如果您已经在使用V2,那么您应该可以在2038年之前使用到期时间来签署URL。如果您使用V4,您可以通过切换到使用V2来解决限制,但这不可取。在较新的S3区域(如法兰克福)不支持V2,如果您按照自己的意愿轮换AWS访问密钥,最终的密钥失效也将使使用该密钥创建的任何签名无效。
在大多数情况下,更正确的方法是在需要时生成签名的URL。如上所述,该操作不需要与S3服务交互,通常可以实时完成。
如果您需要授予特定用户访问“直接链接”的权限,请考虑在应用程序中创建可评估用户凭据的端点,此时您可以生成签名URL并使用HTTP重定向浏览器302
回复。