项目场景:

在一个上传大文件到Minio的场景中,上传大于2G的文件,在Minio中只显示2G


问题描述

从本地的FileInputStream中读取文件,然后上传到Minio
Minio上传文件代码如下

    public void putObject(String objectName, InputStream stream, String contentType) {
        try {
            PutObjectArgs args = PutObjectArgs.builder()
                    .bucket(minioProperties.getBucket())
                    .object(objectName)
                    .contentType(contentType)
                    .stream(stream, stream.available(), -1) 
                    .build();
            minioClient.putObject(args);
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new ServerException(CODE_411);
        }
    }

原因分析:

问题出现在stream.available()这个地方,available() 返回 int 类型,其最大值为 Integer.MAX_VALUE。当文件大小超过 2GB 时,返回值会被强制截断为该值,无法反映实际文件大小

    public int available() throws IOException {
        return 0;
    }

解决方案:

long objectSize = ((FileInputStream) stream).getChannel().size();表示文件大小

修改后的代码

    public void putObject(String objectName, InputStream stream, String contentType) {
        try {
            long objectSize = ((FileInputStream) stream).getChannel().size();
            PutObjectArgs args = PutObjectArgs.builder()
                    .bucket(minioProperties.getBucket())
                    .object(objectName)
                    .contentType(contentType)
                    .stream(stream, objectSize, -1)
                    .build();
            minioClient.putObject(args);
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new ServerException(CODE_411);
        }
    }
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐