@Service
public class SliceFileService {
@Resource
private MinioService minioService;
@Resource
private MinioProperties minioProperties;
private String getBucketPathDir(String md5) {
return DateUtil.format(DateUtil.date(), "yyyy/MM/dd/") + "slice/" + md5;
}
private String getBucketPath(String md5, Integer sliceIndex) {
return getBucketPathDir(md5) + "/slice_" + sliceIndex;
}
public void assertMd5Index(String md5, Integer indexOrTotal) {
Assert.notNull(md5, "文件md5不能为空");
Assert.notNull(indexOrTotal, "分片或总数不能为空");
}
public void upload(FileSliceUploadReq req) {
Assert.notNull(req, "上传对象不能为空");
Integer sliceIndex = req.getSliceIndex();
String md5 = req.getMd5();
assertMd5Index(md5, sliceIndex);
String bucketName = minioProperties.getBucketName();
String bucketPath = getBucketPath(md5, sliceIndex);
//保存minio
minioService.upload(bucketName, bucketPath, req.getFile());
}
private void removeSlice(String md5, Integer sliceTotal, String bucketName) {
//异步执行
ThreadPoolUtil.execute(() -> {
// 删除所有的临时分片文件
List<DeleteObject> delObjects = Stream.iterate(0, i -> ++i)
.limit(sliceTotal)
.map(i -> new DeleteObject(getBucketPath(md5, i)))
.collect(Collectors.toList());
minioService.removeFiles(bucketName, delObjects);
});
}
public SysFile composeFile(FileSliceUploadReq req, SysFile sysFile) {
String md5 = req.getMd5();
Integer total = req.getSliceTotal();
assertMd5Index(md5, total);
List<ComposeSource> source = Stream.iterate(0, i -> ++i).limit(total).map(i ->
ComposeSource.builder()
.bucket(minioProperties.getBucketName())
.object(getBucketPath(md5, i))
.build())
.collect(Collectors.toList());
minioService.composeFile(sysFile.getBucketName(), sysFile.getBucketPath(), source);
removeSlice(req.getMd5(), req.getSliceTotal(), sysFile.getBucketName());
StatObjectResponse objectInfo = minioService.getObjectInfo(sysFile.getBucketName(), sysFile.getBucketPath());
if (null != objectInfo) {
sysFile.setSize(objectInfo.size());
}
return sysFile;
}
}
java 分片上传
最新推荐文章于 2024-09-14 22:11:27 发布