在boto3 upload_file方法中支持对象级别的标记

时间:2019-05-28 21:12:48

标签: python amazon-web-services amazon-s3 boto3 awss3transfermanager

我想在将文件上传到S3时向它们添加标签。 Boto3支持使用put_object方法指定标签,但是考虑到预期的文件大小,我正在使用用于处理分段上传的upload_file函数。但是此函数拒绝将“标记”作为关键字参数。

import boto3
client = boto3.client('s3', region_name='us-west-2')
client.upload_file('test.mp4', 'bucket_name', 'test.mp4',
                   ExtraArgs={'Tagging': 'type=test'})

ValueError: Invalid extra_args key 'Tagging', must be one of: ACL, CacheControl, ContentDisposition, ContentEncoding, ContentLanguage, ContentType, Expires, GrantFullControl, GrantRead, GrantReadACP, GrantWriteACP, Metadata, RequestPayer, ServerSideEncryption, StorageClass, SSECustomerAlgorithm, SSECustomerKey, SSECustomerKeyMD5, SSEKMSKeyId, WebsiteRedirectLocation

我找到了一种直接使用S3传输管理器并修改允许的关键字列表的方法。

from s3transfer import S3Transfer
import boto3

client = boto3.client('s3', region_name='us-west-2')
transfer = S3Transfer(client)
transfer.ALLOWED_UPLOAD_ARGS.append('Tagging')
transfer.upload_file('test.mp4', 'bucket_name', 'test.mp4',
                     extra_args={'Tagging': 'type=test'})

即使这可行,我也不认为这是最好的方法。它可能会产生其他副作用。目前,我无法找到实现此目的的正确方法。任何建议都很好。谢谢。

2 个答案:

答案 0 :(得分:0)

S3 Customization Reference — Boto 3 Docs文档将extra_args的有效值列出为:

  

ALLOWED_UPLOAD_ARGS = ['ACL','CacheControl','ContentDisposition','ContentEncoding','ContentLanguage','ContentType','Expires','GrantFullControl','GrantRead','GrantReadACP','GrantWriteACP', '元数据','RequestPayer','ServerSideEncryption','StorageClass','SSECustomerAlgorithm','SSECustomerKey','SSECustomerKeyMD5','SSEKMSKeyId','WebsiteRedirectLocation']

因此,这似乎不是指定标签的有效方法。

在创建对象之后,您可能需要调用put_object_tagging()来添加标签。

答案 1 :(得分:0)

boto3 现在支持

Tagging 指令。您可以执行以下操作来添加标签:

import boto3

from urllib import parse

s3 = boto3.client("s3")

tags = {"key1": "value1", "key2": "value2"}

s3.upload_file(
    "file_path",
    "bucket",
    "key",
    ExtraArgs={"Tagging": parse.urlencode(tags)},
)