python minio 分片上传大文件
时间: 2025-06-01 09:49:40 浏览: 25
### 使用 Python 和 MinIO 实现大文件的分片上传
为了实现大文件的分片上传功能,可以通过 `minio` 库来完成这一目标。以下是详细的说明以及示例代码。
#### 1. 文件分片逻辑
在上传之前,通常会先将文件按照固定大小进行切分。参考站内引用中的 Python 示例代码[^1]展示了如何将文件按指定大小(如 5 MB)切割成多个片段并保存为独立的小文件。
```python
def slice_file(filename, chunk_size=5 * 1024 * 1024):
chunks = []
with open(filename, 'rb') as f:
index = 0
while True:
f.seek(index * chunk_size)
data = f.read(chunk_size)
if not data:
break
chunks.append((f"{filename}_part_{index}", data))
index += 1
return chunks
```
此函数返回的是一个元组列表,其中每个元组的第一个元素是该分片的名称,第二个元素则是实际的数据字节流。
---
#### 2. 初始化 MinIO 客户端
使用 `minio-py` SDK 来初始化客户端连接到 MinIO 服务器:
```python
from minio import Minio
client = Minio(
"localhost:9000", # 替换为您的 MinIO 地址
access_key="your-access-key",
secret_key="your-secret-key",
secure=False # 是否启用 HTTPS
)
```
如果启用了 SSL/TLS,则需设置参数 `secure=True` 并提供相应的证书路径。
---
#### 3. 分片上传至 MinIO
对于每一个分片,调用 MinIO 提供的 `put_object()` 方法将其单独上传到存储桶中。这里需要注意的是,可以给每个分片命名以便后续拼接还原原文件。
```python
def upload_chunks_to_minio(client, bucket_name, object_prefix, chunks):
for filename, data in chunks:
object_name = f"{object_prefix}/{filename}"
client.put_object(bucket_name, object_name, content=data, length=len(data))
print(f"Uploaded part: {object_name}")
```
在此处定义了一个辅助函数用于批量上传所有分片。注意这里的 `content` 参数应传入二进制形式的内容而非字符串;另外还需要指明其长度以满足 API 要求。
---
#### 4. 下载与重组
当需要下载整个文件时,可以从 MinIO 中逐一获取这些部分再重新组合起来形成完整的副本:
```python
def download_and_reassemble(client, bucket_name, prefix, output_filename):
objects = client.list_objects(bucket_name, prefix=prefix+"/")
with open(output_filename, 'wb') as out_f:
for obj in sorted(objects, key=lambda o: int(o.object_name.split('_')[-1])):
response = client.get_object(bucket_name, obj.object_name)
try:
for d in response.stream(amt=1024*1024):
out_f.write(d)
finally:
response.close()
response.release_conn()
print(f"All parts downloaded and reassembled into '{output_filename}'")
```
这段脚本首先列出了属于特定前缀下的全部对象,并依据它们的名字顺序排列好之后依次写回到本地磁盘上的新文件里去。
---
以上就是基于 Python 结合 MinIO 进行大文件分片上传的一个完整流程介绍及其对应的示范代码[^1][^3]。
阅读全文
相关推荐


















