Amazon s3 有没有办法使用预先签名的URL上传和强制标记?
有没有办法向客户端发送一个预先签名的URL,以将文件上载到S3,并确保上载的文件具有特定的标记?以此处的Python SDK为例,这将根据需要生成URL:Amazon s3 有没有办法使用预先签名的URL上传和强制标记?,amazon-s3,aws-sdk,Amazon S3,Aws Sdk,有没有办法向客户端发送一个预先签名的URL,以将文件上载到S3,并确保上载的文件具有特定的标记?以此处的Python SDK为例,这将根据需要生成URL: s3.生成预签名的url('put\u object', ExpiresIn=3600, Params=dict(Bucket='foo', 键“='bar', ContentType='text/plain', 标记(='foo=bar')) 这在上传时是令人满意的,同时明确提供标记: $curl'https://foo.s3.amazo
s3.生成预签名的url('put\u object',
ExpiresIn=3600,
Params=dict(Bucket='foo',
键“='bar',
ContentType='text/plain',
标记(='foo=bar'))
这在上传时是令人满意的,同时明确提供标记:
$curl'https://foo.s3.amazonaws.com/bar?AWSAccessKeyId=...&Signature=...&content-类型=文本%2Fplain&x-amz-tagging=foo%3Dbar&Expires=1538404508'\
-放
-H'内容类型:文本/普通'\
-H'x-amz-tagging:foo=bar'\
--数据二进制foobar
但是,S3在省略-H'x-amz-tagging:foo=bar'
时也会接受请求,这将上载不带标记的对象。因为我无法控制客户,这…很糟糕
我尝试先创建一个空对象并对其进行标记,然后向其发出预签名的URL,但是PUT
ting对象会完全替换它,包括删除任何标记
我尝试过发布一个预先签名的POST
URL,但它似乎根本不支持标记
参数:
s3.generate_presigned_post('foo','bar',{'tagging':'FooBar'))
$curlhttps://foo.s3.amazonaws.com/ \
-F键=条\
-F'标记=FooBar'
-F AWSAccessKeyId=\
-F策略=\
-F签名=\
-F file=@/tmp/foo
AccessDenied
根据策略无效:
额外输入字段:标记。。。
我只想让客户端直接将文件上传到S3,并确保在这个过程中以某种方式对其进行标记。有办法吗?请尝试以下代码:
fields = {
"x-amz-meta-u1": "value1",
"x-amz-meta-u2": "value2"
}
conditions = [
{"x-amz-meta-u1": "value1"},
{"x-amz-meta-u2": "value2"}
]
presignedurl = s3_client.generate_presigned_post(
bucket_name, "YOUR_BUCKET_NAME",
Fields=copy.deepcopy(fields),
Conditions=copy.deepcopy(conditions)
)
这似乎奏效了!为了澄清这一点,我需要对字段和条件使用
{'tagging':'…'}
和详细的XML标记集语法,这似乎可以根据需要工作。