【发布时间】:2019-11-06 11:57:27
【问题描述】:
在 Python boto3 库中,有一个名为 generate_presigned_post 的方法,它可以创建一个预签名的 URL,用于使用 POST 上传文件。我没有看到 Java 中的等价物,因为可用的东西(“GeneratePresignedUrlRequest”)只支持:GET、PUT、DELETE、HEAD。
想知道我是否遗漏了什么,或者人们是否可以想办法通过用 Java 编写我自己的 generatePresignedPost 来做到这一点?
我正在用 Java 构建一个服务,我想返回一个预签名的 URl,允许将多个文件上传到 S3 中的特定存储桶/密钥前缀。
我首先在 Python 中进行了一些原型设计以了解更多信息并获得了以下代码:
bucket_name = "my-bucket"
key = "test/${filename}"
expires_in = 24*60*60 # 1 day
s3_client = # Initialize Boto S3 Client with Credentials
response = s3_client.generate_presigned_post(bucket_name, key, ExpiresIn=expires_in)
print(response['url'])
print(response['fields'])
(我知道 "${filename}" 被转换为 "start-width" 条件)
Java 版本的 GeneratePresignedUrlRequest 只允许创建 PUT 预签名 URL,不允许我像 POST 版本那样设置“条件”。这就是为什么我希望在 Java 中获得一个 generate_presigned_post 等效项。
Python 代码最终创建了一个如下所示的请求:
fields = {'key': 'test/${filename}'}
conditions = [{'bucket': 'my-bucket'}, ['starts-with', '$key', 'test/']]
request_dict = {'url_path': '/my-bucket', 'query_string': {}, 'method': 'PUT', 'headers': {}, 'body': b'', 'url': 'https://s3.us-west-2.amazonaws.com/my-bucket', 'context': {'is_presign_request': True, 'use_global_endpoint': True}}
返回的内容如下:
response['url'] = 'https://my-bucket.s3.amazonaws.com/'
response['fields'] = {'key': 'test/${filename}', 'AWSAccessKeyId': 'ACCESS_KEY', 'x-amz-security-token': 'SECURITY_TOKEN', 'policy': 'VERY_LONG_POLICY', 'signature': 'SIGNATURE'}
【问题讨论】:
标签: java amazon-web-services amazon-s3 aws-sdk pre-signed-url