use of com.albedo.java.modules.file.domain.dto.FileChunksMergeDto in project albedo by somowhere.
the class AbstractFileChunkStrategy method chunksMerge.
private Result<File> chunksMerge(FileChunksMergeDto info, String fileName) {
String path = FileTypeUtil.getUploadPathPrefix(fileProperties.getLocal().getStoragePath());
int chunks = info.getChunks();
String folder = info.getName();
String md5 = info.getMd5();
int chunksNum = this.getChunksNum(Paths.get(path, folder).toString());
log.info("chunks={}, chunksNum={}", chunks, chunksNum);
// 检查是否满足合并条件:分片数量是否足够
if (chunks == chunksNum) {
// 同步指定合并的对象
Lock lock = FileLock.getLock(folder);
lock.lock();
try {
// 检查是否满足合并条件:分片数量是否足够
List<java.io.File> files = new ArrayList<>(Arrays.asList(this.getChunks(Paths.get(path, folder).toString())));
if (chunks == files.size()) {
// 按照名称排序文件,这里分片都是按照数字命名的
// 这里存放的文件名一定是数字
files.sort(Comparator.comparingInt(f -> Convert.toInt(f.getName(), 0)));
Result<File> result = merge(files, path, fileName, info);
files = null;
// 清理:文件夹,tmp文件
this.cleanSpace(folder, path);
return result;
}
} catch (Exception ex) {
log.error("数据分片合并失败", ex);
return Result.buildFail("数据分片合并失败");
} finally {
// 解锁
lock.unlock();
// 清理锁对象
FileLock.removeLock(folder);
}
}
// 去持久层查找对应md5签名,直接返回对应path
File file = this.md5Check(md5);
if (file == null) {
log.error("文件[签名:" + md5 + "]数据不完整,可能该文件正在合并中");
return Result.buildFail("数据不完整,可能该文件正在合并中, 也有可能是上传过程中某些分片丢失");
}
return Result.buildOkData(file);
}
Aggregations