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;
}
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;
}
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);
}
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;
}
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);
}
}
Aggregations