带有元数据的AWS S3预签名URL

时间:2018-12-06 10:58:30

标签: django python-2.7 boto3

我正在尝试使用下面的boto3创建presigned-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时删除元数据和ContentDisposition,则会成功上传。

Boto3版本:1.9.33

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

2 个答案:

答案 0 :(得分:0)

是的,我知道了, 基本上,在生成签名URL之后,我需要将所有元数据和Content-Dispostion发送到标头以及签名URL。 例如:我的元数据字典为{'test':'test'},那么我需要在标头中发送此元数据,即 x-amz-meta-test 及其值和 content-撤消到AWS

答案 1 :(得分:0)

我使用的是 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,那么上述方法就会起作用。希望能帮助别人...