首先准备一些分片的文件,可以随便找一个本地的视频,然后通过以下代码简单的进行分片:把源文件按照分块大小分片之后存放到输出目的地文件夹中。
void testLocalBreakpointContinuation() throws Exception {
// 思路很简单 就是把源文件分成 指定大小的若干块 然后合并 ok了
// 源文件
File sourceFile = new File("C:\\Users\\17032\\Videos\\ceshi.mkv");
// 输出目的地
String outputDestination = "C:\\Users\\17032\\Videos\\test\\";
// 创建dir
File fileFolder = new File(outputDestination);
if (!fileFolder.exists()) {
fileFolder.mkdirs();
}
// 分块大小
int size = 1024 * 1024 * 6;
// 分块数量 小数向上取整
long num = (long) Math.ceil((sourceFile.length() * 1.0 / size));
// 缓冲区大小 读取大小5MB
byte[] bytes = new byte[1024];
// 访问文件
FileInputStream fileInputStream = new FileInputStream(sourceFile);
// 分块
for (long l = 0; l < num; l++) {
File file = new File(outputDestination + l);
if(file.exists()){
file.delete();
}
// 创建文件
boolean newFile = file.createNewFile();
if (newFile) {
// 写数据
FileOutputStream fileOutputStream = new FileOutputStream(file);
int readCount;
while ((readCount = fileInputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes ,0, readCount);
if (file.length() >= size) break;
}
fileOutputStream.close();
}
}
fileInputStream.close();
System.out.println("完成");
}
打开文件输出目的地文件夹,就拥有了以下若干分片:
然后把通过以下代码把分块逐个上传到minio的bucket中去:
void testMinio() {
// 上传
File chunkFolder = new File("C:\\Users\\17032\\Videos\\test\\");
// 按照文件名排序
List<File> collect = Arrays.stream(chunkFolder.listFiles()).sorted(Comparator.comparingInt(o -> Integer.valueOf(o.getName()))).collect(Collectors.toList());
//将分块文件上传至minio
for (int i = 0; i < collect.size(); i++) {
try {
UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder()
.bucket("testbucket")
.object("chunk/" + i)
.filename(collect.get(i).getAbsolutePath()).build();
minioClient.uploadObject(uploadObjectArgs);
System.out.println("上传分块成功"+i);
} catch (Exception e) {
}
}
}
代码执行成功之后会在minio中的 testbucket 下的chunk文件中看到若干分片,最后通过minio的分片合并API进行合并:
void testMinioMerge() throws Exception{
List<ComposeSource> sources = Stream.iterate(0, i -> ++i)
.limit(13)
.map(i -> ComposeSource.builder()
.bucket("testbucket")
.object("chunk/".concat(Integer.toString(i)))
.build())
.collect(Collectors.toList());
ComposeObjectArgs composeObjectArgs = ComposeObjectArgs.builder()
.bucket("testbucket")
.object("merge01.mkv")
.sources(sources)
.build();
minioClient.composeObject(composeObjectArgs);
}
至此,简单分片上传并且合并已经完成。
温馨提示 分片大小不要低于5MB否则会报
size xxx must be greater than 5242880
对于最后一个分片 大小是可以不用管的 但是其余分片大小一定要 大于 5MB