Minio分片上传解除分片大小限制 - chunk size must be greater than 5242880

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

大概内容:

在使用minio进行上传大文件时,往往需要对大文件进行分片上传。在这个过程中就会踩到很多坑,minio进行文件上传时,可以直连文件服务器,而后端作为参数保存和合并发起的调用者存在。在合并的过程中,因为minio自身代码限制,会出现一些不必要的问题。


一、chunk size must be greater than 5242880?

在后端参与的上传中,往往调用后端接口进行上传,是不需要对文件大小进行最小限制的,而minio不一样,在源码中,minio规定:minio除最后一块分片可以小于5m,其余分片必须大于等于5m,也就是说,出现这个问题,要么是minio在对你上传分片排序出现问题,造成中间一片小于5m;要么是前端定义的分片大小本身就小于5m

二、解决方法

1.前后端统一分片大小

这是最简单的解决方法,前后端统一将分片大小设置为5mb。最后一片可以小于5m,这样的作法优点是简单。缺点是在外露上传接口后,固定分片大小会造成网络差的环境容易出现请求超时的情况。

2.修改minio源码

通过composeObject方法找到合并接口的源代码,并且download下载源码

    client.composeObject(
            ComposeObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .sources(sourceObjectList)
                    .build());

在源码中有一个calculatePartCount方法,字面意思为计算分片数量:

int partCount = calculatePartCount(sources);

在这个方法下,有几个定义的常量,其中就有限制最小为5mb的常量,我们通过修改5m为1mb或者你想要的大小就可以完成取消文件大小限制

      if (size < ObjectWriteArgs.MIN_MULTIPART_SIZE && sources.size() != 1 && i != sources.size()) {
        throw new IllegalArgumentException(
            "source "
                + src.bucket()
                + "/"
                + src.object()
                + ": size "
                + size
                + " must be greater than "
                + ObjectWriteArgs.MIN_MULTIPART_SIZE);
      }

将510241024修改为指定大小

  // allowed minimum part size is 5MiB in multipart upload.
  public static final int MIN_MULTIPART_SIZE = 5 * 1024 * 1024;

后面出如何修改源码并使用


总结

在带宽足够的情况下,可以直接使用第一种方法;而在特殊的条件下,选第二种;

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
Minio支持分片上传大文件,这可以提高上传速度和可靠性。分片上传的基本原理是将大文件分割成多个小块,每个小块上传Minio服务器,最后在服务器端将这些小块组合成完整的文件。 下面是使用Minio SDK进行分片上传的基本步骤: 1. 初始化Minio客户端 ```python from minio import Minio minio_client = Minio(endpoint="your-minio-endpoint", access_key="your-access-key", secret_key="your-secret-key", secure=False) ``` 2. 开始分片上传 ```python from minio import PostPolicy from datetime import timedelta object_name = "your-object-name" file_path = "path-to-your-file" chunk_size = 1024 * 1024 * 5 # 5MB per chunk # 初始化一个PostPolicy对象 post_policy = PostPolicy() post_policy.set_bucket("your-bucket-name") post_policy.set_key(object_name) post_policy.set_content_type("application/octet-stream") post_policy.set_content_length(os.path.getsize(file_path)) post_policy.set_expires(timedelta(days=10)) # 初始化一个新的分片上传任务 upload_id = minio_client._new_multipart_upload("your-bucket-name", object_name) # 分片上传 with open(file_path, 'rb') as file_data: while True: data = file_data.read(chunk_size) if not data: break part_number = minio_client._upload_part("your-bucket-name", object_name, upload_id, len(parts), data) parts.append(part_number) # 完成上传 minio_client._complete_multipart_upload("your-bucket-name", object_name, upload_id, parts) ``` 3. 取消分片上传 如果在分片上传过程中出现错误或者需要中止上传任务,可以使用以下代码取消上传: ```python minio_client._remove_incomplete_upload("your-bucket-name", object_name, upload_id) ``` 注意:以上代码仅为示例代码,实际使用时需要根据自己的需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值