Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 有没有办法使用预先签名的URL上传和强制标记?_Amazon S3_Aws Sdk - Fatal编程技术网

Amazon s3 有没有办法使用预先签名的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

有没有办法向客户端发送一个预先签名的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.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标记集语法,这似乎可以根据需要工作。