首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有元数据的AWS S3预签名URL

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

Stack Overflow用户
提问于 2018-12-06 10:58:30
回答 4查看 11.1K关注 0票数 10

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

代码语言:javascript
运行
复制
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

下面是我所指的文档:url

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-12-07 09:12:54

是的,我让它正常工作,基本上在生成签名URL之后,我需要发送所有元数据和内容-在标题中的分解以及签名的URL。对于示例:我的元数据字典是{'test':'test'},那么我需要将这个元数据发送到报头,即x-amz-meta-test以及它的值和content-dispostion

票数 10
EN

Stack Overflow用户

发布于 2021-07-26 14:49:57

我使用的是createPresignedPost,对我来说,通过将我想要的元数据添加到Fields参数中,我可以这样做:-

代码语言:javascript
运行
复制
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,上面的内容就会有效。希望能帮助别人..。

票数 4
EN

Stack Overflow用户

发布于 2022-06-24 16:35:50

我发现元数据对象需要是键/值对,值作为字符串(示例是Nodejs ):

代码语言:javascript
运行
复制
const AWS = require('aws-sdk');
const s3 = new AWS.S3();

exports.handler = async (event) => {
    const { key, type, metadata } = JSON.parse(event.body);

    // example
    /*metadata: {
      foo: 'bar',
      x: '123',
      y: '22.4213213'
    }*/

    return await s3.getSignedUrlPromise('putObject', {
        Bucket: 'the-product-uploads',
        Key: key,
        Expires: 300,
        ContentType: type,
        Metadata: metadata
    });
};

然后,在请求头中,需要显式地添加每个k/v:

代码语言:javascript
运行
复制
await fetch(signedUrl, {
      method: "PUT",
      headers: {
        "Content-Type": fileData.type,
        "x-amz-meta-foo": "bar",
        "x-amz-meta-x": x.toString(),
        "x-amz-meta-y": y.toString()
      },
      body: fileBuffer
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53649888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档