【问题标题】:Java equivalent of AWS S3 Python Client "generate_presigned_post"Java 等效于 AWS S3 Python 客户端“generate_presigned_post”
【发布时间】: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


    【解决方案1】:

    可以使用下面的代码sn-p

    GeneratePresignedUrlRequest generatePresignedUrlRequest = 
                    new GeneratePresignedUrlRequest(bucketName, objectKey)
                    .withMethod(HttpMethod.POST)
                    .withExpiration(expiration);
    URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
    

    您可以查看here 以获得完整的 Java 源代码

    【讨论】:

    【解决方案2】:

    从亚马逊找到这篇文章:https://aws.amazon.com/articles/browser-uploads-to-s3-using-html-post-forms/

    这种方式可以生成签名:

    import sun.misc.BASE64Encoder;
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    
    String policy = (new BASE64Encoder()).encode(
        policy_document.getBytes("UTF-8")).replaceAll("\n","").replaceAll("\r","");
    
    Mac hmac = Mac.getInstance("HmacSHA1");
    hmac.init(new SecretKeySpec(
        aws_secret_key.getBytes("UTF-8"), "HmacSHA1"));
    String signature = (new BASE64Encoder()).encode(
        hmac.doFinal(policy.getBytes("UTF-8")))
        .replaceAll("\n", "");
    

    如果这可以从 AmazonS3Client 轻松获得,那会容易得多。

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2020-07-18
      • 2021-05-02
      • 2019-03-04
      • 2018-01-07
      相关资源
      最近更新 更多