今天测试一个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就快速解决了,有同样问题的程序猿可以参考一下如果有大佬发现了原因麻烦评论告知一下