MinIO Python SDK - 对象操作

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

基本操作

获取对象:get_object

get_object(bucket_name, object_name, offset=0, length=0, request_headers=None, ssec=None, version_id=None, extra_query_params=None)
# 返回值:urllib3.response.HTTPResponse对象
参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
offsetint对象数据的起始字节位置。
lengthint从偏移量开始的对象数据的字节数。
request_headersdict任何要与 GET 请求一起添加的附加标头。
ssecSseCustomerKey服务器端加密客户密钥。
version_idstr对象的版本 ID 。
extra_query_paramsdict用于高级用法的额外查询参数。
# 获取一个对象的数据
try:
    response = client.get_object("my-bucket", "my-object")
    # Read data from response.
finally:
    response.close()
    response.release_conn()

# 获取指定版本的对象
try:
    response = client.get_object(
        "my-bucket", "my-object",
        version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d",
    )
    # Read data from response.
finally:
    response.close()
    response.release_conn()

# 获取一个对象并设置偏移位置和获取的字节长度
try:
    response = client.get_object(
        "my-bucket", "my-object", offset=512, length=1024,
    )
    # Read data from response.
    print(response.read())
finally:
    response.close()
    response.release_conn()

# 获取一个 SSE-C 加密对象的数据。
try:
    response = client.get_object(
        "my-bucket", "my-object",
        ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"),
    )
    # Read data from response.
finally:
    response.close()
    response.release_conn()

通过SQL表达式选择对象内容:select_object_content

select_object_content(bucket_name, object_name, request)
# 返回值:一个读取器包含所请求的记录和进度信息,作为 SelectObjectReader。
参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
requestSelectRequestselect request。
with client.select_object_content(
        "my-bucket",
        "my-object.csv",
        SelectRequest(
            "select * from S3Object",
            CSVInputSerialization(),
            CSVOutputSerialization(),
            request_progress=True,
        ),
) as result:
    for data in result.stream():
        print(data.decode())
    print(result.stats())

下载对象为文件:fget_object

fget_object(bucket_name, object_name, file_path, request_headers=None, ssec=None, version_id=None, extra_query_params=None, tmp_file_path=None)
# 返回值:对象信息作为对象
参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
file_pathstr要下载的文件名。
request_headersdict任何要与 GET 请求一起添加的附加标头。
ssecSseCustomerKey服务器端加密客户密钥。
version_idstr对象的版本 ID 。
extra_query_paramsdict用于高级用法的额外查询参数。
tmp_file_pathstr临时文件的路径。
# 下载某个对象的数据。
client.fget_object("my-bucket", "my-object", "my-filename")

# 下载指定版本的某一对象的数据。
client.fget_object(
    "my-bucket", "my-object", "my-filename",
    version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d",
)

# 下载一个采用 SSE-C 加密方式的对象的数据。
client.fget_object(
    "my-bucket", "my-object", "my-filename",
    ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"),
)

复制对象:copy_object

copy_object(bucket_name, object_name, source, sse=None, metadata=None, tags=None, retention=None, legal_hold=False, metadata_directive=None, tagging_directive=None)

# 返回值:ObjectWriteResult object,对象写入结果对象

通过服务器端复制另一个对象的数据来创建一个对象。在此 API 中,最大支持的源对象大小为 5GiB。

参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
sourceCopySource源对象信息。
sseSse ess目标对象的服务器端加密。
metadatadict任何要与目标对象一起复制的用户自定义元数据。
tagsTags目标对象的标签。
retentionRetention保留配置。
legal_holdbool用于为目标对象设置法律保留标志的标志。
metadata_directivestr用于处理目标对象的用户元数据的指令。
tagging_directivestr用于处理目标对象标签的指令。
from datetime import datetime, timezone
from minio.commonconfig import REPLACE, CopySource

# 将一个对象从一个存储桶复制到另一个存储桶。
result = client.copy_object(
    "my-bucket",
    "my-object",
    CopySource("my-sourcebucket", "my-sourceobject"),
)
print(result.object_name, result.version_id)

# 根据条件复制一个对象。
result = client.copy_object(
    "my-bucket",
    "my-object",
    CopySource(
        "my-sourcebucket",
        "my-sourceobject",
        modified_since=datetime(2014, 4, 1, tzinfo=timezone.utc),
    ),
)
print(result.object_name, result.version_id)

# 从存储桶中复制一个对象,并保留其元数据。
metadata = {"test_meta_key": "test_meta_value"}
result = client.copy_object(
    "my-bucket",
    "my-object",
    CopySource("my-sourcebucket", "my-sourceobject"),
    metadata=metadata,
    metadata_directive=REPLACE,
)
print(result.object_name, result.version_id)

组合对象:compose_object

compose_object(bucket_name, object_name, sources, sse=None, metadata=None, tags=None, retention=None, legal_hold=False)
# 返回值:ObjectWriteResult object,对象写入结果对象。

通过服务器端复制将来自不同源对象的数据组合起来创建一个对象。

参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
sourceslist对象列表。
sseSse ess目标对象的服务器端加密。
metadatadict任何要与目标对象一起复制的用户自定义元数据。
tagsTags目的地对象的标签。
retentionRetention保留配置。
legal_holdbool用于为目标对象设置法律保留标志的标志。

注意:compose_object要求所有源对象的最小尺寸为 5MB(防止无效的碎片化合并操作)

from minio.commonconfig import ComposeSource
from minio.sse import SseS3

sources = [
    ComposeSource("my-job-bucket", "my-object-part-one"),
    ComposeSource("my-job-bucket", "my-object-part-two"),
    ComposeSource("my-job-bucket", "my-object-part-three"),
]

# 通过组合源对象列表来创建“my-bucket/my-object”这一对象。
result = client.compose_object("my-bucket", "my-object", sources)
print(result.object_name, result.version_id)

# 通过组合源对象列表来创建包含用户元数据的“my-bucket/my-object”对象。
result = client.compose_object(
    "my-bucket",
    "my-object",
    sources,
    metadata={"test_meta_key": "test_meta_value"},
)
print(result.object_name, result.version_id)

# 使用用户元数据和服务器端加密创建名为“my-bucket/my-object”的对象,并通过合并源对象列表来实现。
client.compose_object("my-bucket", "my-object", sources, sse=SseS3())
print(result.object_name, result.version_id)
关于sse=SseS3()参数的说明

对合成后的对象进行自动加密存储,满足数据安全和合规性要求。具体特性包括:

  1. ​加密算法​:使用 AES-256-GCM 算法(AES-256 加密 + Galois/Counter 模式认证)
  2. ​密钥管理​:由 MinIO 自动管理加密密钥(无需用户干预)
  3. 透明加密​:数据在存储时加密,读取时自动解密

技术实现原理

  1. ​加密流程​

    • 合成操作完成后,MinIO 自动对新对象 search_index2.json 进行加密
    • 加密密钥由 MinIO 的主密钥派生(主密钥由集群自动轮换管理)
  2. 元数据标记​加密后的对象会附加 x-amz-server-side-encryption: AES256 头部标识

  3. 解密过程​客户端读取对象时,MinIO 自动检测加密标记并解密数据

方式密钥管理适用场景性能影响
SseS3()MinIO 自动管理通用数据保护
SseKms(key)AWS KMS 密钥需要密钥审计的场景
SseCustomer客户提供密钥需要自带密钥的私有云环境

注意事项:

  1. 性能考量:​加密会增加 CPU 开销,建议在专用存储节点启用
  2. 密钥轮换​:MinIO 每 24 小时自动轮换主密钥,旧密钥保留 7 天用于解密历史数据
  3. 跨区域复制:​加密对象在复制时会保持加密状态(需目标桶启用相同加密策略)

上传流到对象:put_object

put_object(bucket_name, object_name, data, length, content_type=”application/octet-stream”, metadata=None, sse=None, progress=None, part_size=0, num_parallel_uploads=3, tags=None, retention=None, legal_hold=False)
# 返回值:ObjectWriteResult object,对象写入结果对象。

将流中的数据上传到存储桶中的对象。

参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
dataobject具有可调用的read()方法并返回字节对象的对象。
lengthint数据大小;-1 表示未知大小,并设置有效的部分大小。
content_typestr对象的内容类型。
metadatadict随PUT请求一起上传的任何其他元数据。
sseSse ess服务器端加密。
progressthreading进度对象。
part_sizeint分块大小。tagsTags该对象的标签。
retentionRetention保留配置。
legal_holdbool用于为对象设置法律保留标志。
# 上传数据
result = client.put_object("my-bucket", "my-object", io.BytesIO(b"hello"), 5)
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id)) 
# created my-object object; etag: 5d41402abc4b2a76b9719d911017c592, version-id: None

# 上传未知大小的数据。
data = urlopen("https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.81.tar.xz")
result = client.put_object("my-bucket", "my-object", data, length=-1, part_size=10*1024*1024)
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))
# created my-object object; etag: 95483276d592d28d077ed0ac7e3a1dce-11, version-id: None

# 上传带有内容类型的数据。
result = client.put_object("my-bucket", "my-object", io.BytesIO(b"hello"), 5, content_type="application/csv")
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))
# created my-object object; etag: 5d41402abc4b2a76b9719d911017c592, version-id: None

# 上传带有元数据的数据。
result = client.put_object("my-bucket", "my-object", io.BytesIO(b"hello"), 5, metadata={"My-Project": "one"})
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))
# created my-object object; etag: 5d41402abc4b2a76b9719d911017c592, version-id: None

# 使用客户密钥类型进行服务器端加密来上传数据。(下载时也需要使用sse)
result = client.put_object("my-bucket", "my-object", io.BytesIO(b"hello"), 5, sse=SseCustomerKey(b"32byteslongsecretkeymustprovided"))
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))
# created my-object object; etag: 37d29175d53c401e73d84f6d5101fa5e, version-id: None

# 使用 KMS 类型的服务器端加密方式上传数据。(需要给minio配置SseKMS才能用)
result = client.put_object("my-bucket", "my-object", io.BytesIO(b"hello"), 5, sse=SseKMS("KMS-KEY-ID", {"Key1": "Value1", "Key2": "Value2"}))
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

# 使用 S3 类型的服务器端加密方式上传数据。(只是存储是会加密,下载、读取时会自动解密)
result = client.put_object("my-bucket", "my-object", io.BytesIO(b"hello"), 5, sse=SseS3())
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))
# created my-object object; etag: 5d41402abc4b2a76b9719d911017c592, version-id: None

# 上传带有标签、保留期限和法律保留要求的数据。(需要创建桶时时桶开启对象锁,并配置了桶对象锁)
from minio.commonconfig import Tags, GOVERNANCE
from minio.retention import Retention
date = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=30)
tags = Tags(for_object=True)
tags["User"] = "jsmith"
result = client.put_object("my-bucket", "my-object", io.BytesIO(b"hello"), 5, tags=tags, retention=Retention(GOVERNANCE, date), legal_hold=True)
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))
# created my-object object; etag: 5d41402abc4b2a76b9719d911017c592, version-id: 12ba6797-861b-42ed-9a39-00c892d70622(有版本号了)


# 带有进度条的上传数据操作。Progress需要自己实现:https://cloud.tencent.com/developer/ask/sof/107852269
result = client.put_object("my-bucket", "my-object", io.BytesIO(b"hello"), 5, progress=Progress())
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

上传文件到对象:fput_object

fput_object(bucket_name, object_name, file_path, content_type=”application/octet-stream”, metadata=None, sse=None, progress=None, part_size=0, num_parallel_uploads=3, tags=None, retention=None, legal_hold=False)
# 返回值:ObjectWriteResult object,对象写入结果对象。

将文件中的数据上传到存储桶中的对象。

参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
file_pathstr要上传的文件名。
content_typestr对象的内容类型。
metadatadict字典随PUT请求一起上传的任何其他元数据。
sseSse ess服务器端加密。
progressthreading线程进度对象。
part_sizeint分块大小。
tagsTags标签该对象的标签。
retentionRetention保留保留配置。
legal_holdbool保龄球用于为对象设置法律保留标志。
# 上传数据
result = client.fput_object("my-bucket", "my-object", "my-filename")
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

# 上传带有内容类型的数据。
result = client.fput_object("my-bucket", "my-object", "my-filename", content_type="application/csv")
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

# 上传带有元数据的数据。
result = client.fput_object("my-bucket", "my-object", "my-filename", metadata={"My-Project": "one"})
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

# 使用客户密钥类型进行服务器端加密来上传数据。
result = client.fput_object("my-bucket", "my-object", "my-filename", sse=SseCustomerKey(b"32byteslongsecretkeymustprovided"))
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

# 使用 KMS 类型的服务器端加密方式上传数据。
result = client.fput_object("my-bucket", "my-object", "my-filename", sse=SseKMS("KMS-KEY-ID", {"Key1": "Value1", "Key2": "Value2"}))
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

# 使用 S3 类型的服务器端加密方式上传数据。
result = client.fput_object("my-bucket", "my-object", "my-filename", sse=SseS3())
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id ))

# 上传带有标签、保留期限和法律保留要求的数据。
date = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=30)
tags = Tags(for_object=True)
tags["User"] = "jsmith"
result = client.fput_object("my-bucket", "my-object", "my-filename", tags=tags, retention=Retention(GOVERNANCE, date), legal_hold=True)
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

# 带有进度条的上传数据操作。
result = client.fput_object("my-bucket", "my-object", "my-filename", progress=Progress())
print("created {0} object; etag: {1}, version-id: {2}".format(result.object_name, result.etag, result.version_id))

获取对象信息和元数据:stat_object

stat_object(bucket_name, object_name, ssec=None, version_id=None, extra_headers=None, extra_query_params=None)
# 返回值:Object information as Object,对象信息作为对象
参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
ssecSseCustomerKey服务器端加密客户密钥。
version_idstr对象的版本 ID。
extra_headersdict用于高级用法的额外HTTP标头。
extra_query_paramsdict用于高级用法的额外查询参数。
# 获取对象信息。
result = client.stat_object("my-bucket", "my-object")
print("last-modified: {0}, size: {1}".format(result.last_modified, result.size))
# last-modified: 2025-07-10 05:23:53+00:00, size: 5

# 获取指定版本的对象信息。
result = client.stat_object("my-bucket", "my-object", version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d")
print("last-modified: {0}, size: {1}".format(result.last_modified, result.size))

# 获取 SSE-C 加密对象信息。
result = client.stat_object("my-bucket", "my-object", ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"))
print("last-modified: {0}, size: {1}".format(result.last_modified, result.size))

删除对象:remove_object

remove_object(bucket_name, object_name, version_id=None)
# bucket_name:桶名
# object_name: 对象名
# version_id:版本号
# 删除对象
client.remove_object("my-bucket", "my-object")

# 删除对象的某个版本(桶设置了对象锁的,在保护期时不能指定版本,只能直接删除,删除后会形成新的版本)
client.remove_object("my-bucket", "my-object", version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d",)

批量删除对象:remove_objects

remove_objects(bucket_name, delete_object_list, bypass_governance_mode=False)
# bucket_name:桶名
# delete_object_list:要删除对象的可迭代对象
# bypass_governance_mode:是否绕过治理保留模式。
# 返回值:An iterator containing :class:DeleteError <DeleteError> object
from minio.deleteobjects import DeleteObject
# 删除对象列表
errors = client.remove_objects(
    "my-bucket",
    [
        DeleteObject("my-object1"),
        DeleteObject("my-object2"),
        DeleteObject("my-object3", "13f88b18-8dcd-4c83-88f2-8631fdb6250c"),
    ],
)
for error in errors:
    print("error occurred when deleting object", error)

# 递归地移除前缀。
delete_object_list = map(
    lambda x: DeleteObject(x.object_name),
    client.list_objects("my-bucket", "my/prefix/", recursive=True),
)
errors = client.remove_objects("my-bucket", delete_object_list)
for error in errors:
    print("error occurred when deleting object", error)

对象标签

删除对象标签:delete_object_tags

delete_object_tags(bucket_name, object_name, version_id=None)
# bucket_name:桶名
# object_name:对象名
# version_id:版本号

client.delete_object_tags("my-bucket", "my-object")

获取对象标签:get_object_tages

get_object_tags(bucket_name, object_name, version_id=None)
# bucket_name:桶名
# object_name:对象名
# version_id:版本号
# 返回值:Tags object,标记对象。

tags = client.get_object_tags("my-bucket", "my-object")  # {'Project': 'Project One', 'User': 'jsmith'}

设置对象标签:set_object_tages

set_object_tags(bucket_name, object_name, tags, version_id=None)
# bucket_name:桶名
# object_name:对象名
# tags:Tags configuration,标签的配置。
# version_id:版本号
```python
tags = Tags.new_object_tags()
tags["Project"] = "Project One"
tags["User"] = "jsmith"
client.set_object_tags("my-bucket", "my-object", tags)

对象法律保留

启用对象法律保留:enable_object_legal_hold

enable_object_legal_hold(bucket_name, object_name, version_id=None)

client.enable_object_legal_hold("my-bucket", "my-object")

解除对象法律保留:disable_object_legal_hold

disable_object_legal_hold(bucket_name, object_name, version_id=None)

client.disable_object_legal_hold("my-bucket", "my-object")

是否启用对象法律保留:is_object_legal_hold_enable

is_object_legal_hold_enabled(bucket_name, object_name, version_id=None)

if client.is_object_legal_hold_enabled("my-bucket", "my-object"):
    print("legal hold is enabled on my-object")
else:
    print("legal hold is not enabled on my-object")

对象保留期

获取对象保留期:get_object_retention

get_object_retention(bucket_name, object_name, version_id=None)

config = client.get_object_retention("my-bucket", "my-object")

设置对象保留期:set_object_retention

set_object_retention(bucket_name, object_name, config, version_id=None)

config = Retention(GOVERNANCE, datetime.utcnow() + timedelta(days=10))
client.set_object_retention("my-bucket", "my-object", config)

预签名URL

获取对象的预签名URL:presigned_get_object

presigned_get_object(bucket_name, object_name, expires=timedelta(days=7), response_headers=None, request_date=None, version_id=None, extra_query_params=None)

获取对象的预签名 URL,以便在指定过期时间和自定义请求参数的情况下下载其数据。

参数类型描述
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
expiresdatetime.timedelta过期时间(以秒为单位);默认为7天。
response_headersdict可选的 response_headers 参数用于指定响应字段,例如日期、大小、文件类型、有关服务器的数据等。
request_datedatetime.datetime可选的 request_date 参数用于指定不同的请求日期。默认值为当前日期。
version_idstr对象的版本 ID。
extra_query_paramsdict用于高级用法的额外查询参数。
# 获取用于下载“my-object”(位于“my-bucket”中)的预签名 URL 字符串,其默认过期时间为 7 天。
url = client.presigned_get_object("my-bucket", "my-object")
print(url)
# https://play.min.io/my-bucket/2.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20250710%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250710T073254Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=6a76492111597e19c3842da7d65e14018360c8acb22674f10fae97ed8adae3e2

# 获取用于下载“my-object”对象的预签名 URL 字符串,该对象位于“my-bucket”中,有效期为两小时。
url = client.presigned_get_object("my-bucket", "my-object", expires=timedelta(hours=2))
print(url)

获取用于上传的预签名URL:presigned_put_object

presigned_put_object(bucket_name, object_name, expires=timedelta(days=7))

获取用于上传数据的对象预签名 URL,该 URL 具有过期时间和自定义请求参数。

# 获取预签名 URL 字符串,以便将数据上传至“my-bucket”中的“my-object”对象,且默认有效期为 7 天。
url = client.presigned_put_object("my-bucket", "my-object")
print(url)

# 获取一个预签名的 URL 字符串,用于将数据上传至“my-object”(位于“my-bucket”中),有效期为两小时。
url = client.presigned_put_object("my-bucket", "my-object", expires=timedelta(hours=2))
print(url)

获取POST表单数据:presigned_post_policy

presigned_post_policy(policy)
# 返回值:Form-data containing dict,包含字典的表单数据

获取对象的PostPolicy表单数据,以便使用 POST 方法上传其数据。

policy = PostPolicy("my-bucket", datetime.utcnow() + timedelta(days=10))
policy.add_starts_with_condition("key", "my/object/prefix/")
policy.add_content_length_range_condition(1*1024*1024, 10*1024*1024)
form_data = client.presigned_post_policy(policy)

获取自定义预签名URL:get_presigned_url

get_presigned_url(method, bucket_name, object_name, expires=timedelta(days=7), response_headers=None, request_date=None, version_id=None, extra_query_params=None)
# 返回值:URL string,URL字符串

获取对象的预签名 URL,用于指定的 HTTP 方法、过期时间和自定义请求参数。

参数类型描述
methodstrHTTP方法。
bucket_namestr桶名。
object_namestr存储桶中的对象名称。
expiresdatetime.timedelta过期时间(以秒为单位);默认为 7 天。
response_headersdict可选的 response_headers 参数用于指定响应字段,例如日期、大小、文件类型、有关服务器的数据等。
request_datedatetime.datetime参数用于指定不同的请求日期。默认值为当前日期。
version_idstr对象的版本 ID。
extra_query_paramsdict用于高级用法的额外查询参数。
# 获取用于删除“my-object”(位于“my-bucket”中)的预签名 URL 字符串,该操作的过期时间为一天。
url = client.get_presigned_url(
    "DELETE",
    "my-bucket",
    "my-object",
    expires=timedelta(days=1),
)
print(url)
# https://play.min.io/my-bucket/2.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20250710%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250710T075010Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b80b929ab653601753bc1f2b2bd256bd0a2618530440a7a028becf712391779d

# 获取用于上传“my-object”至“my-bucket”中的预签名 URL 字符串,要求响应内容类型为“application/json”,且有效期为一天。
url = client.get_presigned_url(
    "PUT",
    "my-bucket",
    "my-object",
    expires=timedelta(days=1),
    response_headers={"response-content-type": "application/json"},
)
print(url)
# https://play.min.io/my-bucket/2.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20250710%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250710T075254Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=2cddce9faf3014e04930904337f6f813124de8d2cc1fa1047218de792e774063


# 获取用于下载“my-object”对象的预签名 URL 字符串,该对象位于“my-bucket”中,有效期为两小时。
url = client.get_presigned_url(
    "GET",
    "my-bucket",
    "my-object",
    expires=timedelta(hours=2),
)
print(url)

PUT URL使用方式如下:
在这里插入图片描述

批量上传:upload_snowball_objects

upload_snowball_objects(bucket_name, object_list, metadata=None, sse=None, tags=None, retention=None, legal_hold=False, staging_filename=None, compression=False)
# 返回值:ObjectWriteResult object,对象写入结果对象。

通过单次put调用上传多个对象。这是通过创建可选压缩的中间TAR文件来实现的,该文件将上传到S3服务。

参数类型描述
bucket_namestr桶名。
object_listiterable包含SnowballObject 对象的可迭代对象。
metadatadict随PUT请求一起上传的任何其他元数据。
sseSse ess服务器端加密。
tagsTags该对象的标签。
retentionRetention保留配置。
legal_holdbool用于为对象设置法律保留标志。
staging_filenamestr用于创建中间 tarball 的暂存文件名。
compressionbool用于压缩 tarball 的标志。

注意:如果使用SnowballObject上传文件的话,每个文件最小是5M

import io
from datetime import datetime

from minio import Minio
from minio.commonconfig import SnowballObject

# Upload snowball object.
client.upload_snowball_objects(
    "my-bucket",
    [
        SnowballObject("my-object1", filename="/etc/hostname"),  # 不能小于5M
        SnowballObject(
            "my-object2", data=io.BytesIO("hello"), length=5,
        ),
        SnowballObject(
            "my-object3", data=io.BytesIO("world"), length=5,
            mod_time=datetime.now(),
        ),
    ],
    compression={"algorithm": "lz4"}  # 全局压缩配置(可选)
)

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼义虎神

打赏5C币,作者可获得4C币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值