Minio python实现分片预签名上传

本文介绍如何使用Minio进行预签名上传以保护密钥安全,并结合分片上传解决大文件上传的问题。预签名简化了上传流程,前端直接与Minio通信,而分片上传则突破了5GB的文件大小限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为啥要预签名

前端上传文件时无法直接和Minio通信,因为不可能把秘钥暴露在前端

预签名实现

前端把桶名称(query.bucket_name)和对象名称(query.object_name)传给后端,后端计算好上传URL后返回给前端,前端就可以使用URL直接上传文件到Minio中

注意:预签名URL是可以设置过期时间的——expires=timedelta(days=1)

@api.get("/presigned/url", summary="上传url预签名")
def presigned_url(query: ObjectQuery):
    url = minio_client.presigned_put_object(query.bucket_name, query.object_name, expires=timedelta(days=1))
    print(url)
    return response(data=url)

为啥要分片上传

Minio允许上传的最大文件为5GB

预签名和分片结合

  1. 前端把桶名称(query.bucket_name)和对象名称(query.object_name)传给后端获取上传ID
  2. 前端计算文件的分片总数量,通过后端获取每个分片的上传列表
  3. 前端通过每个分片的上传列表直接将分片上传至Minio
  4. 分片合并

时序图:
在这里插入图片描述

接口实现:

@api.get("/upload/id", summary="获取分片上传ID")
def get_upload_id(query: MultipartUploadIDQuery):
    upload_id = minio_client._create_multipart_upload(bucket_name=query.bucket_name, object_name=query.object_name,
                                                      headers={})
    return response(data=upload_id)

@api.get("/multipart/presigned/urls", summary="获取分片上传url")
def multipart_presigned_urls(query: MultipartPresignedQuery):
    url_list = []
    for i in range(query.part_count):
        url = minio_client.get_presigned_url(
            "PUT",
            query.bucket_name,
            query.object_name,
            expires=timedelta(days=1),
            extra_query_params={"partNumber": str(i + 1), "uploadId": query.upload_id}
        )
        url_list.append(url)
    return response(data=url_list)


@api.post("/complete/part", summary="合并分片")
def complete_part(body: CompletePartBody):
    part_list = minio_client._list_parts(body.bucket_name, body.object_name, body.upload_id, max_parts=body.part_count)
    print(part_list)
    minio_client._complete_multipart_upload(body.bucket_name, body.object_name, body.upload_id, part_list.parts)
    return response()

值得注意的是:max_parts的默认值为1000,如果分片总数超过1000,则需要手动指定

总结

  • 预签名上传简化了上传流程,将前端→后端→对象存储转化为前端→对象存储,节省了上传带宽
  • 预签名与分片上传相结合,解决了大文件上传限制,并利用Minio分片合并机制大大加快了分片合并的速度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

llc的足迹

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值