Minio上传分块文件不按原大小上传

今天测试一个Minio上传分块文件源文件如下

        

 可以看见每个分块都是5兆,分块代码如下:

 //测试文件分块方法
    @Test
    public void testChunk() throws IOException {
        File sourceFile = new File("D:\\develop1\\upload\\1.mp4");//源文件路径
        String chunkPath = "D:\\develop1\\upload\\chunk\\"; //分块文件路径
        File chunkFolder = new File(chunkPath);
        if (!chunkFolder.exists()) {
            chunkFolder.mkdirs();
        }
        //分块大小
         final int MIN_MULTIPART_SIZE = 1024 * 1024 * 5;
        //分块数量
        long chunkNum = (long) Math.ceil(sourceFile.length() * 1.0 / MIN_MULTIPART_SIZE);
        System.out.println("分块总数:"+chunkNum);
        //缓冲区大小
        byte[] b = new byte[1024];
        //使用RandomAccessFile访问文件
        RandomAccessFile raf_read = new RandomAccessFile(sourceFile, "r");
        //分块
        for (int i = 0; i < chunkNum; i++) {
            //创建分块文件
            File file = new File(chunkPath+i);
                //向分块文件中写数据
                RandomAccessFile raf_write = new RandomAccessFile(file, "rw");
                int len = -1;
                while ((len = raf_read.read(b)) != -1) {
                    raf_write.write(b, 0, len);
                    if (file.length() >= MIN_MULTIPART_SIZE) {
                        break;
                    }
                }
                raf_write.close();
                System.out.println("完成分块"+i);


        }
        raf_read.close();
    }

后续进行测试上传Minio代码如下:

 @Test
    public void uploadChunk(){
        String chunkFolderPath = "D:\\develop1\\upload\\chunk\\";
        File chunkFolder = new File(chunkFolderPath);
        //分块文件
        File[] files = chunkFolder.listFiles();
        //将分块文件上传至minio
        for (int i = 0; i < files.length; i++) {
            try {
                UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder().bucket("testbucket").object("chunk/" + i).filename(files[i].getAbsolutePath()).build();
                minioClient.uploadObject(uploadObjectArgs);
                System.out.println("上传分块成功"+i);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

上传结果却是这样的:

 可以看见第二个文件变成了最小的,而最后一个则是5兆查了很多博客以及百度了很久都没有找到类似的问题以及解决方案,这样在合并的时候Minio就会报错因为Minio只允许最后一个文件大小小于5兆,如果要修改则要修改源码并且我不确定修改源码后合并出来的文件是否是完整可用的

所以我在进行分块的时候将每个文件大小设置为6兆

//分块大小
         final int MIN_MULTIPART_SIZE = 1024 * 1024 * 6;

分块后文件如下:

 再次进行上传Minio中文件如下

 此时可以看到上传的文件最后一个为最小其余都是6兆,并且在进行后续合并测试也通过了,合并出来的文件也完好无损,关于这个问题本来想深挖一下原因的但是因为凌晨2点半在写这个不想浪费时间也想多留住几根头发所以试下了改变分块文件的大小为6就快速解决了,有同样问题的程序猿可以参考一下如果有大佬发现了原因麻烦评论告知一下

MinIO 是一个高性能的对象存储服务,兼容Amazon S3云存储服务。使用Java代码上传文件MinIO服务器可以通过MinIO提供的官方Java客户端库来实现。以下是一个简单的示例,展示如何使用Java代码将文件上传MinIO服务器: 1. **添加依赖**:首先,你需要在你的项目中添加MinIOJava客户端库依赖。如果你使用的是Maven,可以在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.2</version> <!-- 请根据需要选择最新版本 --> </dependency> ``` 2. **编写上传代码**:接下来,你可以编写Java代码来上传文件MinIO服务器。以下是一个完整的示例: ```java import io.minio.MinioClient; import io.minio.PutObjectArgs; import io.minio.errors.MinioException; import java.io.FileInputStream; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; public class MinioUploadExample { public static void main(String[] args) { try { // 创建MinIO客户端实例 MinioClient minioClient = MinioClient.builder() .endpoint("https://play.min.io") // MinIO服务器地址 .credentials("YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY") // 替换为你的访问密钥和秘密密钥 .build(); // 要上传文件路径 String filePath = "path/to/your/file.txt"; // 目标桶名称 String bucketName = "my-bucket"; // 目标对象名称(在桶中的名称) String objectName = "file.txt"; // 上传文件 minioClient.putObject( PutObjectArgs.builder().bucket(bucketName).object(objectName).stream( new FileInputStream(filePath), -1, 10485760) // 10MB分块大小 .contentType("application/octet-stream") .build()); System.out.println("文件上传成功!"); } catch (MinioException e) { System.err.println("错误发生: " + e); } catch (InvalidKeyException | NoSuchAlgorithmException | IOException e) { e.printStackTrace(); } } } ``` 在这个示例中: - `MinioClient.builder()` 用于创建一个MinIO客户端实例。 - `endpoint` 方法指定了MinIO服务器的URL。 - `credentials` 方法提供了访问MinIO所需的访问密钥和秘密密钥。 - `putObject` 方法用于上传文件到指定的桶中。 请确保你已经在MinIO服务器上创建了相应的桶(bucket),并且替换示例中的`YOUR-ACCESSKEYID`和`YOUR-SECRETACCESSKEY`为你的实际访问密钥和秘密密钥。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值