基本操作
获取对象: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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| offset | int | 对象数据的起始字节位置。 |
| length | int | 从偏移量开始的对象数据的字节数。 |
| request_headers | dict | 任何要与 GET 请求一起添加的附加标头。 |
| ssec | SseCustomerKey | 服务器端加密客户密钥。 |
| version_id | str | 对象的版本 ID 。 |
| extra_query_params | dict | 用于高级用法的额外查询参数。 |
# 获取一个对象的数据
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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| request | SelectRequest | select 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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| file_path | str | 要下载的文件名。 |
| request_headers | dict | 任何要与 GET 请求一起添加的附加标头。 |
| ssec | SseCustomerKey | 服务器端加密客户密钥。 |
| version_id | str | 对象的版本 ID 。 |
| extra_query_params | dict | 用于高级用法的额外查询参数。 |
| tmp_file_path | str | 临时文件的路径。 |
# 下载某个对象的数据。
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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| source | CopySource | 源对象信息。 |
| sse | Sse ess | 目标对象的服务器端加密。 |
| metadata | dict | 任何要与目标对象一起复制的用户自定义元数据。 |
| tags | Tags | 目标对象的标签。 |
| retention | Retention | 保留配置。 |
| legal_hold | bool | 用于为目标对象设置法律保留标志的标志。 |
| metadata_directive | str | 用于处理目标对象的用户元数据的指令。 |
| tagging_directive | str | 用于处理目标对象标签的指令。 |
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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| sources | list | 对象列表。 |
| sse | Sse ess | 目标对象的服务器端加密。 |
| metadata | dict | 任何要与目标对象一起复制的用户自定义元数据。 |
| tags | Tags | 目的地对象的标签。 |
| retention | Retention | 保留配置。 |
| legal_hold | bool | 用于为目标对象设置法律保留标志的标志。 |
注意: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()参数的说明
对合成后的对象进行自动加密存储,满足数据安全和合规性要求。具体特性包括:
- 加密算法:使用 AES-256-GCM 算法(AES-256 加密 + Galois/Counter 模式认证)
- 密钥管理:由 MinIO 自动管理加密密钥(无需用户干预)
- 透明加密:数据在存储时加密,读取时自动解密
技术实现原理
-
加密流程
- 合成操作完成后,MinIO 自动对新对象 search_index2.json 进行加密
- 加密密钥由 MinIO 的主密钥派生(主密钥由集群自动轮换管理)
-
元数据标记加密后的对象会附加 x-amz-server-side-encryption: AES256 头部标识
-
解密过程客户端读取对象时,MinIO 自动检测加密标记并解密数据
| 方式 | 密钥管理 | 适用场景 | 性能影响 |
|---|---|---|---|
| SseS3() | MinIO 自动管理 | 通用数据保护 | 低 |
| SseKms(key) | AWS KMS 密钥 | 需要密钥审计的场景 | 中 |
| SseCustomer | 客户提供密钥 | 需要自带密钥的私有云环境 | 高 |
注意事项:
- 性能考量:加密会增加 CPU 开销,建议在专用存储节点启用
- 密钥轮换:MinIO 每 24 小时自动轮换主密钥,旧密钥保留 7 天用于解密历史数据
- 跨区域复制:加密对象在复制时会保持加密状态(需目标桶启用相同加密策略)
上传流到对象: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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| data | object | 具有可调用的read()方法并返回字节对象的对象。 |
| length | int | 数据大小;-1 表示未知大小,并设置有效的部分大小。 |
| content_type | str | 对象的内容类型。 |
| metadata | dict | 随PUT请求一起上传的任何其他元数据。 |
| sse | Sse ess | 服务器端加密。 |
| progress | threading | 进度对象。 |
| part_size | int | 分块大小。tagsTags该对象的标签。 |
| retention | Retention | 保留配置。 |
| legal_hold | bool | 用于为对象设置法律保留标志。 |
# 上传数据
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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| file_path | str | 要上传的文件名。 |
| content_type | str | 对象的内容类型。 |
| metadata | dict | 字典随PUT请求一起上传的任何其他元数据。 |
| sse | Sse ess | 服务器端加密。 |
| progress | threading | 线程进度对象。 |
| part_size | int | 分块大小。 |
| tags | Tags | 标签该对象的标签。 |
| retention | Retention | 保留保留配置。 |
| legal_hold | bool | 保龄球用于为对象设置法律保留标志。 |
# 上传数据
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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| ssec | SseCustomerKey | 服务器端加密客户密钥。 |
| version_id | str | 对象的版本 ID。 |
| extra_headers | dict | 用于高级用法的额外HTTP标头。 |
| extra_query_params | dict | 用于高级用法的额外查询参数。 |
# 获取对象信息。
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_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| expires | datetime.timedelta | 过期时间(以秒为单位);默认为7天。 |
| response_headers | dict | 可选的 response_headers 参数用于指定响应字段,例如日期、大小、文件类型、有关服务器的数据等。 |
| request_date | datetime.datetime | 可选的 request_date 参数用于指定不同的请求日期。默认值为当前日期。 |
| version_id | str | 对象的版本 ID。 |
| extra_query_params | dict | 用于高级用法的额外查询参数。 |
# 获取用于下载“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 方法、过期时间和自定义请求参数。
| 参数 | 类型 | 描述 |
|---|---|---|
| method | str | HTTP方法。 |
| bucket_name | str | 桶名。 |
| object_name | str | 存储桶中的对象名称。 |
| expires | datetime.timedelta | 过期时间(以秒为单位);默认为 7 天。 |
| response_headers | dict | 可选的 response_headers 参数用于指定响应字段,例如日期、大小、文件类型、有关服务器的数据等。 |
| request_date | datetime.datetime | 参数用于指定不同的请求日期。默认值为当前日期。 |
| version_id | str | 对象的版本 ID。 |
| extra_query_params | dict | 用于高级用法的额外查询参数。 |
# 获取用于删除“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_name | str | 桶名。 |
| object_list | iterable | 包含SnowballObject 对象的可迭代对象。 |
| metadata | dict | 随PUT请求一起上传的任何其他元数据。 |
| sse | Sse ess | 服务器端加密。 |
| tags | Tags | 该对象的标签。 |
| retention | Retention | 保留配置。 |
| legal_hold | bool | 用于为对象设置法律保留标志。 |
| staging_filename | str | 用于创建中间 tarball 的暂存文件名。 |
| compression | bool | 用于压缩 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"} # 全局压缩配置(可选)
)

4234

被折叠的 条评论
为什么被折叠?



