Search in sources :

Example 1 with FileChunksMergeDto

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);
}
Also used : FileChunkStrategy(com.albedo.java.modules.file.strategy.FileChunkStrategy) Wrappers(com.baomidou.mybatisplus.core.toolkit.Wrappers) Arrays(java.util.Arrays) Result(com.albedo.java.common.core.util.Result) RequiredArgsConstructor(lombok.RequiredArgsConstructor) LocalDateTime(java.time.LocalDateTime) FileUtils(org.apache.commons.io.FileUtils) IOException(java.io.IOException) StrPool(com.albedo.java.common.core.util.StrPool) CommonConstants(com.albedo.java.common.core.constant.CommonConstants) File(com.albedo.java.modules.file.domain.File) FileChunksMergeDto(com.albedo.java.modules.file.domain.dto.FileChunksMergeDto) FileServerProperties(com.albedo.java.modules.file.properties.FileServerProperties) FileTypeUtil(com.albedo.java.modules.file.utils.FileTypeUtil) ArrayList(java.util.ArrayList) FileLock(com.albedo.java.modules.file.strategy.FileLock) Slf4j(lombok.extern.slf4j.Slf4j) List(java.util.List) Lock(java.util.concurrent.locks.Lock) Paths(java.nio.file.Paths) Convert(cn.hutool.core.convert.Convert) FileRepository(com.albedo.java.modules.file.repository.FileRepository) Comparator(java.util.Comparator) ArrayList(java.util.ArrayList) File(com.albedo.java.modules.file.domain.File) IOException(java.io.IOException) FileLock(com.albedo.java.modules.file.strategy.FileLock) Lock(java.util.concurrent.locks.Lock)

Aggregations

Convert (cn.hutool.core.convert.Convert)1 CommonConstants (com.albedo.java.common.core.constant.CommonConstants)1 Result (com.albedo.java.common.core.util.Result)1 StrPool (com.albedo.java.common.core.util.StrPool)1 File (com.albedo.java.modules.file.domain.File)1 FileChunksMergeDto (com.albedo.java.modules.file.domain.dto.FileChunksMergeDto)1 FileServerProperties (com.albedo.java.modules.file.properties.FileServerProperties)1 FileRepository (com.albedo.java.modules.file.repository.FileRepository)1 FileChunkStrategy (com.albedo.java.modules.file.strategy.FileChunkStrategy)1 FileLock (com.albedo.java.modules.file.strategy.FileLock)1 FileTypeUtil (com.albedo.java.modules.file.utils.FileTypeUtil)1 Wrappers (com.baomidou.mybatisplus.core.toolkit.Wrappers)1 IOException (java.io.IOException)1 Paths (java.nio.file.Paths)1 LocalDateTime (java.time.LocalDateTime)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Comparator (java.util.Comparator)1 List (java.util.List)1 Lock (java.util.concurrent.locks.Lock)1