Search in sources :

Example 6 with File

use of com.albedo.java.modules.file.domain.File in project albedo by somowhere.

the class FileContext method findUrl.

private Map<String, String> findUrl(List<File> pathFiles) {
    Map<String, List<File>> pathMap = pathFiles.stream().collect(Collectors.groupingBy(File::getPath, LinkedHashMap::new, toList()));
    Map<String, String> map = new LinkedHashMap<>(MapHelper.initialCapacity(pathMap.size()));
    pathMap.forEach((path, files) -> {
        if (CollUtil.isEmpty(files)) {
            return;
        }
        File fileFile = files.get(0);
        if (FileStorageType.LOCAL.eq(fileFile.getStorageType())) {
            map.put(path, fileFile.getUrl());
        } else {
            FileStrategy fileStrategy = getFileStrategy(fileFile.getStorageType());
            map.put(path, fileStrategy.getUrl(FileGetUrlBo.builder().bucket(fileFile.getBucket()).path(fileFile.getPath()).originalFileName(fileFile.getOriginalFileName()).build()));
        }
    });
    return map;
}
Also used : List(java.util.List) Collectors.toList(java.util.stream.Collectors.toList) File(com.albedo.java.modules.file.domain.File) MultipartFile(org.springframework.web.multipart.MultipartFile) LinkedHashMap(java.util.LinkedHashMap)

Example 7 with File

use of com.albedo.java.modules.file.domain.File in project albedo by somowhere.

the class AbstractFileChunkStrategy method chunksMerge.

@Override
public Result<File> chunksMerge(FileChunksMergeDto info) {
    String filename = info.getName() + StrPool.DOT + info.getExt();
    Result<File> result = chunksMerge(info, filename);
    log.info("path={}", result);
    if (result.getCode() == CommonConstants.SUCCESS && result.getData() != null) {
        // 文件名
        File filePo = result.getData();
        filePo.setOriginalFileName(info.getSubmittedFileName()).setSize(info.getSize()).setFileMd5(info.getMd5()).setContentType(info.getContextType()).setUniqueFileName(filename).setSuffix(info.getExt());
        fileMapper.insert(filePo);
        return Result.buildOkData(filePo);
    }
    return result;
}
Also used : File(com.albedo.java.modules.file.domain.File)

Example 8 with File

use of com.albedo.java.modules.file.domain.File 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)

Example 9 with File

use of com.albedo.java.modules.file.domain.File in project albedo by somowhere.

the class AbstractFileChunkStrategy method md5Check.

@Override
public File md5Check(String md5, Long accountId) {
    File file = md5Check(md5);
    if (file == null) {
        return null;
    }
    // 分片存在,不需上传, 复制一条数据,重新插入
    copyFile(file);
    file.setId(null).setCreatedBy(accountId).setCreatedDate(LocalDateTime.now());
    file.setLastModifiedDate(LocalDateTime.now()).setLastModifiedBy(accountId);
    fileMapper.insert(file);
    return file;
}
Also used : File(com.albedo.java.modules.file.domain.File)

Example 10 with File

use of com.albedo.java.modules.file.domain.File in project albedo by somowhere.

the class AbstractFileStrategy method upload.

/**
 * 上传文件
 *
 * @param multipartFile 文件
 * @return 附件
 */
@Override
public File upload(MultipartFile multipartFile, String bucket, String bizType) {
    try {
        if (!StrUtil.contains(multipartFile.getOriginalFilename(), FILE_SPLIT)) {
            throw BizException.wrap(ResponseCode.BASE_VALID_PARAM.build("文件缺少后缀名"));
        }
        File file = File.builder().originalFileName(multipartFile.getOriginalFilename()).contentType(multipartFile.getContentType()).size(multipartFile.getSize()).bizType(bizType).suffix(FilenameUtils.getExtension(multipartFile.getOriginalFilename())).fileType(FileTypeUtil.getFileType(multipartFile.getContentType())).build();
        uploadFile(file, multipartFile, bucket);
        return file;
    } catch (Exception e) {
        log.error("ex", e);
        throw BizException.wrap(ResponseCode.BASE_VALID_PARAM.build("文件上传失败"), e);
    }
}
Also used : File(com.albedo.java.modules.file.domain.File) MultipartFile(org.springframework.web.multipart.MultipartFile) BizException(com.albedo.java.common.core.exception.BizException)

Aggregations

File (com.albedo.java.modules.file.domain.File)11 MultipartFile (org.springframework.web.multipart.MultipartFile)5 FileInputStream (java.io.FileInputStream)3 List (java.util.List)3 FileServerProperties (com.albedo.java.modules.file.properties.FileServerProperties)2 ArrayList (java.util.ArrayList)2 LinkedHashMap (java.util.LinkedHashMap)2 Collectors.toList (java.util.stream.Collectors.toList)2 Convert (cn.hutool.core.convert.Convert)1 CommonConstants (com.albedo.java.common.core.constant.CommonConstants)1 BizException (com.albedo.java.common.core.exception.BizException)1 Result (com.albedo.java.common.core.util.Result)1 StrPool (com.albedo.java.common.core.util.StrPool)1 FileChunksMergeDto (com.albedo.java.modules.file.domain.dto.FileChunksMergeDto)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 OSS (com.aliyun.oss.OSS)1 OSSClientBuilder (com.aliyun.oss.OSSClientBuilder)1