【问题标题】:AWS S3 presigned URL with metadata带有元数据的 AWS S3 预签名 URL
【发布时间】:2019-05-08 01:27:17
【问题描述】:

我正在尝试使用下面的 boto3 创建预签名 URL

s3 = boto3.client(
    's3', 
    aws_access_key_id=settings.AWS_ACCESS_KEY, 
    aws_secret_access_key=settings.AWS_ACCESS_SECRET, 
    region_name=settings.AWS_SES_REGION_NAME,
    config=Config(signature_version='s3v4')
)
metadata = {
    'test':'testing'
}
presigned_url = s3.generate_presigned_url(
ClientMethod='put_object', 
Params={
    'Bucket': settings.AWS_S3_BUCKET_NAME,
    'Key': str(new_file.uuid),
    'ContentDisposition': 'inline',
    'Metadata': metadata
})

因此,在生成 URL 后,我尝试使用 Ajax 将其上传到 S3,它给出了 403 禁止。如果我在创建 URL 时删除了 Metadata 和 ContentDisposition,它将成功上传。

Boto3 版本:1.9.33

以下是我所指的文档: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url

【问题讨论】:

    标签: django python-2.7 boto3


    【解决方案1】:

    是的,我得到了它的工作, 基本上在生成签名 URL 之后,我需要将所有元数据和 Content-Dispostion 与签名 URL 一起发送到标头中。 例如:我的元数据字典是 {'test':'test'} 然后我需要在标题中发送这个元数据,即 x-amz-meta-test 连同它的值和 content-部署到 AWS

    【讨论】:

    • 这是否意味着,您需要在生成预签名 URL 时将其添加到“Params”中,并由使用此预签名 URL 上传文件的客户端在标头中发送?
    • 是的,否则在尝试提交到预签名 URL 时会出错,因为标头不同。
    • 我收到“我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法”。你能提供示例代码吗?谢谢
    【解决方案2】:

    我使用的是createPresignedPost,对我来说,我通过将我想要的元数据添加到Fields 参数中来实现这一点:-

    const params = {
        Expires: 60,
        Bucket: process.env.fileStorageName,
        Conditions: [['content-length-range', 1, 1000000000]], // 1GB
        Fields: {
            'Content-Type': 'application/pdf',
            key: strippedName,
            'x-amz-meta-pdf-type': pdfType,
            'x-amz-meta-pdf-id': pdfId,
        },
    };
    

    只要您将文件元数据中所需的数据传递给您用来创建preSignedPost 响应的 lambda,那么上述方法就可以工作。希望能帮助别人...

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多