完成文件上传、复制和移动的接口,其余待完成。

This commit is contained in:
chenxudong 2024-12-23 16:46:14 +08:00
parent 3275ed51b4
commit 4cd57f64b4
8 changed files with 379 additions and 21 deletions

View File

@ -9,6 +9,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -42,8 +43,10 @@ public class EdFileInfoController {
} }
@RequestMapping("upload") @RequestMapping("upload")
public ElectromagneticResult<?> upload() { public ElectromagneticResult<?> upload(@RequestParam("parentId") String parentId,
return null; @RequestParam("file") MultipartFile file,
@RequestParam("strategy") Integer strategy) {
return edFileInfoService.upload(parentId, file, strategy);
} }
@RequestMapping("download") @RequestMapping("download")
@ -57,18 +60,22 @@ public class EdFileInfoController {
} }
@RequestMapping("moveFile") @RequestMapping("moveFile")
public ElectromagneticResult<?> moveFile() { public ElectromagneticResult<?> moveFile(@RequestParam("id") String id,
return null; @RequestParam("targetFolderId") String targetFolderId,
@RequestParam("strategy") Integer strategy) {
return edFileInfoService.moveFile(id, targetFolderId, strategy);
} }
@RequestMapping("copyFile") @RequestMapping("copyFile")
public ElectromagneticResult<?> copyFile() { public ElectromagneticResult<?> copyFile(@RequestParam("id") String id,
return null; @RequestParam("targetFolderId") String targetFolderId,
@RequestParam("strategy") Integer strategy) {
return edFileInfoService.copyFile(id, targetFolderId, strategy);
} }
@RequestMapping("versionView") @RequestMapping("versionView")
public ElectromagneticResult<?> versionView() { public ElectromagneticResult<?> versionView(@RequestParam String fileId) {
return null; return edFileInfoService.versionView(fileId);
} }
@RequestMapping("versionBack") @RequestMapping("versionBack")

View File

@ -2,17 +2,39 @@ package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.enums.EffectFlagEnum;
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
import java.util.Date;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@TableName("ed_file_info") @TableName("ed_file_info")
@Accessors(chain = true) @Accessors(chain = true)
@Data @Data
@FieldNameConstants @FieldNameConstants
public class EdFileInfo extends BaseModel { public class EdFileInfo extends BaseModel {
public void newInit() {
String userId = UserThreadLocal.getUserId();
String newFileDbId = IdWorker.getSnowFlakeIdString();
String fileTime = EleCommonUtil.getNowTimeStr();
Date now = new Date();
this.setUpdatedBy(userId);
this.setId(newFileDbId);
this.setUpdateTime(now);
this.setCreatedTime(now);
this.setFileTime(fileTime);
this.setCreatedBy(userId);
this.setFileId(newFileDbId);
this.setEffectFlag(EffectFlagEnum.EFFECT.code);
}
/** /**
* 主键ID * 主键ID
*/ */

View File

@ -0,0 +1,13 @@
package com.electromagnetic.industry.software.manage.pojo.resp;
import lombok.Data;
@Data
public class FileVersionViewVO {
private String id;
private String fileName;
private Integer fileVersion;
private Integer preVersion;
private String fileCode;
private Integer effectFlag;
}

View File

@ -6,6 +6,7 @@ import com.electromagnetic.industry.software.manage.pojo.req.FileInfoQueryDTO;
import com.electromagnetic.industry.software.manage.pojo.req.UpdateFileInfoDTO; import com.electromagnetic.industry.software.manage.pojo.req.UpdateFileInfoDTO;
import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@ -92,4 +93,36 @@ public interface EdFileInfoService {
* @return * @return
*/ */
ResponseEntity<InputStreamResource> batchExport(String dataIdArr, HttpServletResponse response) throws IOException; ResponseEntity<InputStreamResource> batchExport(String dataIdArr, HttpServletResponse response) throws IOException;
/**
* 文件上传
* @param parentId
* @param file
* @param strategy
* @return
*/
ElectromagneticResult<?> upload(String parentId, MultipartFile file, Integer strategy);
/**
* 版本查看
* @param fileId
* @return
*/
ElectromagneticResult<?> versionView(String fileId);
/**
* 移动文件
* @param id
* @param targetFolderId
* @return
*/
ElectromagneticResult<?> moveFile(String id, String targetFolderId, Integer strategy);
/**
* 复制文件
* @param id
* @param targetFolderId
* @return
*/
ElectromagneticResult<?> copyFile(String id, String targetFolderId, Integer strategy);
} }

View File

@ -6,7 +6,9 @@ import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.text.StrFormatter; import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -304,4 +306,15 @@ public class CommonService {
throw new BizException(-1, info); throw new BizException(-1, info);
} }
} }
public String getCodePathByDbPath(String dbPath) {
List<String> paths = StrUtil.split(dbPath, MYSQL_FILE_PATH_SPLIT);
List<String> reversePaths = CollUtil.reverse(paths);
for (String path : reversePaths) {
if (path.length() == 6) {
return path;
}
}
return null;
}
} }

View File

@ -2,7 +2,7 @@ package com.electromagnetic.industry.software.manage.service.serviceimpl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
@ -11,17 +11,17 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ZipUtil; import cn.hutool.core.util.ZipUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES; import cn.hutool.crypto.symmetric.AES;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.electromagnetic.industry.software.common.enums.EffectFlagEnum;
import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum; import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum;
import com.electromagnetic.industry.software.common.enums.PublishEnum;
import com.electromagnetic.industry.software.common.exception.BizException; import com.electromagnetic.industry.software.common.exception.BizException;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.common.util.EleLog; import com.electromagnetic.industry.software.common.util.*;
import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper; import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper;
import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo; import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo;
import com.electromagnetic.industry.software.manage.pojo.other.FileInfoDTO; import com.electromagnetic.industry.software.manage.pojo.other.FileInfoDTO;
@ -30,6 +30,7 @@ import com.electromagnetic.industry.software.manage.pojo.req.FileChunkResultDTO;
import com.electromagnetic.industry.software.manage.pojo.req.FileInfoQueryDTO; import com.electromagnetic.industry.software.manage.pojo.req.FileInfoQueryDTO;
import com.electromagnetic.industry.software.manage.pojo.req.UpdateFileInfoDTO; import com.electromagnetic.industry.software.manage.pojo.req.UpdateFileInfoDTO;
import com.electromagnetic.industry.software.manage.pojo.resp.FileInfoQueryPageVO; import com.electromagnetic.industry.software.manage.pojo.resp.FileInfoQueryPageVO;
import com.electromagnetic.industry.software.manage.pojo.resp.FileVersionViewVO;
import com.electromagnetic.industry.software.manage.service.EdFileInfoService; import com.electromagnetic.industry.software.manage.service.EdFileInfoService;
import com.electromagnetic.industry.software.manage.service.FileSystemService; import com.electromagnetic.industry.software.manage.service.FileSystemService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -42,6 +43,7 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -169,7 +171,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
try { try {
EdFileInfo fileInfo = this.baseMapper.selectOne(Wrappers.<EdFileInfo>lambdaQuery().eq(EdFileInfo::getId, id)); EdFileInfo fileInfo = this.baseMapper.selectOne(Wrappers.<EdFileInfo>lambdaQuery().eq(EdFileInfo::getId, id));
String fileSysPath = commonService.getFileSysPath(fileInfo.getFilePath()); String fileSysPath = commonService.getFileSysPath(fileInfo.getFilePath()) + "." + fileInfo.getFileCode();
Assert.isTrue(FileUtil.exist(fileSysPath), "下载文件不存在。"); Assert.isTrue(FileUtil.exist(fileSysPath), "下载文件不存在。");
FileSystemResource fileSystemResource = new FileSystemResource(fileSysPath); FileSystemResource fileSystemResource = new FileSystemResource(fileSysPath);
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
@ -304,6 +306,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> mergeChunks(String identifier, String fileName, Integer totalChunks) { public ElectromagneticResult<?> mergeChunks(String identifier, String fileName, Integer totalChunks) {
String destZipPath = doSysFileMerge(identifier, fileName, totalChunks); String destZipPath = doSysFileMerge(identifier, fileName, totalChunks);
int index = destZipPath.lastIndexOf(".zip"); int index = destZipPath.lastIndexOf(".zip");
@ -320,9 +323,35 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
throw new BizException(-1, e.getMessage()); throw new BizException(-1, e.getMessage());
} }
update2Database(zipDirPath); update2Database(zipDirPath);
update2FileSystem(zipDirPath);
return null; return null;
} }
private void update2Database(String colibDirPath) {
// 首先解密该文件
AES aes = SecureUtil.aes(password.getBytes());
String zipFilePath = "";
try(
InputStream inputStream = Files.newInputStream(Paths.get(colibDirPath));
OutputStream outputStream = Files.newOutputStream(Paths.get(zipFilePath));
) {
aes.decrypt(inputStream, outputStream, true);
} catch (Exception e) {
String info = "文件上传失败";
log.error(info, e);
throw new BizException(-1, info);
}
String tmpDir = "";
// ZipUtil.unzipq
// TODO 注意 需要reversion
}
private void update2FileSystem(String zipDirPath) {
}
/** /**
* 导出 * 导出
* *
@ -351,7 +380,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
String destPath = downloadDataDir + File.separator + commonService.getDbPath(edFileInfo.getFileId()); String destPath = downloadDataDir + File.separator + commonService.getDbPath(edFileInfo.getFileId());
FileUtil.copy(filePath, destPath, false); FileUtil.copy(filePath, destPath, false);
} }
String mysqlInfo = getMysqlInfo(); String mysqlInfo = JSONUtil.toJsonStr(resFiles);
FileUtil.writeString(mysqlInfo, downloadDataDir + File.separator + "mysql.info", Charset.defaultCharset()); FileUtil.writeString(mysqlInfo, downloadDataDir + File.separator + "mysql.info", Charset.defaultCharset());
String exportZipFile = downloadDataDir + File.separator + prjName + ".zip"; String exportZipFile = downloadDataDir + File.separator + prjName + ".zip";
String exportColibFile = downloadDataDir + File.separator + prjName + EXPORT_FILE_SUFFIX; String exportColibFile = downloadDataDir + File.separator + prjName + EXPORT_FILE_SUFFIX;
@ -388,14 +417,252 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
.body(new InputStreamResource(fileSystemResource.getInputStream())); .body(new InputStreamResource(fileSystemResource.getInputStream()));
} }
private String getMysqlInfo() { /**
return ""; * 文件上传
* @param parentId
* @param file
* @param strategy 1-跳过冲突文件 2-做版本更新 3-重命名文件名加_1"
* @return
*/
@Override
public ElectromagneticResult<?> upload(String parentId, MultipartFile file, Integer strategy) {
// 首先检查是否是同名文件
try {
String fileName = file.getOriginalFilename();
String mainName = FileUtil.mainName(fileName);
String suffix = FileUtil.getSuffix(fileName);
Assert.isTrue(EleCommonUtil.isFileNameValid(fileName), "文件名不符合规范只能包含中文字符、下划线、连字符、加号、数字和英文字符且长度小于32。");
Long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getParentId, parentId)
.eq(EdFileInfo::getFileName, mainName)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)
.eq(EdFileInfo::getFileType, suffix));
if (count > 0) {
handUploadRepeatFile(parentId, file, strategy);
} else {
EdFileInfo parentFolderInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getId, parentId)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
EdFileInfo newEdFileInfo = new EdFileInfo();
newEdFileInfo.newInit();
String codePathByDbPath = commonService.getCodePathByDbPath(parentFolderInfo.getFilePath());
String fileCode = commonService.createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, newEdFileInfo.getFileTime());
newEdFileInfo.setParentId(parentId)
.setFileCode(fileCode)
.setFileName(mainName)
.setFileType(suffix)
.setFileVersion(FILE_START_VERSION)
.setFileSize(file.getSize())
.setFilePath(parentFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
.setDataType(EleDataTypeEnum.FILE.code)
.setDataStatus(PublishEnum.PUBLISHED.getCode())
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setFileCode(fileCode)
.setPrjDir(false);
this.baseMapper.insert(newEdFileInfo);
String fileDestPath = commonService.getFileSysPath(parentFolderInfo.getFileId()) + File.separator + mainName + suffix + "." + fileCode;
fileSystemService.save(file.getInputStream(), fileDestPath);
}
} catch (Exception e) {
String info = "上传文件失败";
log.error(info, e);
throw new BizException(-1, info);
}
return ElectromagneticResultUtil.success(true);
} }
private void update2Database(String zipDirPath) { /**
// TODO 注意 需要reversion * 版本查看
*
* @param fileId
* @return
*/
@Override
public ElectromagneticResult<?> versionView(String fileId) {
List<EdFileInfo> edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFileId, EdFileInfo::getFileVersion, EdFileInfo::getPreVersion, EdFileInfo::getFileCode, EdFileInfo::getEffectFlag)
.eq(EdFileInfo::getFileId, fileId));
List<FileVersionViewVO> fileVersionViewVOS = BeanUtil.copyToList(edFileInfos, FileVersionViewVO.class);
return ElectromagneticResultUtil.success(fileVersionViewVOS);
} }
/**
* 移动文件
*
* @param id
* @param targetFolderId
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> moveFile(String id, String targetFolderId, Integer strategy) {
return moveFile(id, targetFolderId, strategy, true);
}
private void handMoveConflict(String targetFolderId, Integer strategy, EdFileInfo srcFileInfo, EdFileInfo destFolderInfo, boolean deleteSrc) {
if (strategy == 2) {
// 做版本更新
List<EdFileInfo> sameFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getParentId, targetFolderId)
.eq(EdFileInfo::getFileName, srcFileInfo.getFileName())
.eq(EdFileInfo::getFileType, srcFileInfo.getFileType()));
Integer maxFileVersion = Collections.max(sameFileInfos, Comparator.comparing(EdFileInfo::getFileVersion)).getFileVersion();
String newFileDbId = IdWorker.getSnowFlakeIdString();
String fileTime = EleCommonUtil.getNowTimeStr();
String fileCode = commonService.createFileCode(targetFolderId, srcFileInfo.getFileType(), maxFileVersion + 1, fileTime);
EdFileInfo destSaveFileInfo = BeanUtil.copyProperties(sameFileInfos.get(0), EdFileInfo.class);
destSaveFileInfo.newInit();
destSaveFileInfo.setFileVersion(maxFileVersion + 1)
.setFilePath(destSaveFileInfo + MYSQL_FILE_PATH_SPLIT + newFileDbId)
.setPreVersion(maxFileVersion)
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setFileCode(fileCode);
this.baseMapper.insert(destSaveFileInfo);
} else if (strategy == 3) {
// 文件名加_1版本号从100开始
// 处理MySQL相关逻辑
EdFileInfo newEdFileInfo = BeanUtil.copyProperties(srcFileInfo, EdFileInfo.class);
newEdFileInfo.newInit();
newEdFileInfo.setParentId(targetFolderId)
.setFileVersion(FILE_START_VERSION)
.setFileName(srcFileInfo.getFileName() + "_1")
.setFileCode(commonService.createFileCode(targetFolderId, srcFileInfo.getFileType(), FILE_START_VERSION, newEdFileInfo.getFileTime()))
.setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId());
this.baseMapper.insert(newEdFileInfo);
// 移动文件
String srcFileSysPath = commonService.getFileSysPath(srcFileInfo.getFilePath());
String destFileSysPath = commonService.getFileSysPath(destFolderInfo.getFilePath());
fileSystemService.moveFile(srcFileSysPath, destFileSysPath);
}
}
private ElectromagneticResult<?> moveFile(String id, String targetFolderId, Integer strategy, boolean deleteSrc) {
// 获取原文件mysql模型
EdFileInfo srcFileInfo = this.baseMapper.selectById(id);
// 判断目标路径下是否有同名文件如果所有的同名文件1如果所有文件都已经被作废则该文件为新文件版本号从100开始2如果有没有被作废的文件则冲突处理方式按---1-跳过冲突文件 2-做版本更新 3-重命名文件名加"_1"
List<EdFileInfo> destFolderFiles = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getParentId, targetFolderId));
EdFileInfo destFolderInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getId, targetFolderId));
List<EdFileInfo> effectFileInfos = destFolderFiles.stream().filter(e -> Objects.equals(e.getEffectFlag(), EffectFlagEnum.EFFECT.code)).collect(Collectors.toList());
if (CollUtil.isEmpty(effectFileInfos) || CollUtil.isEmpty(destFolderFiles)) {
// 没有同名文件
// 首先将信息保存到MySQL
EdFileInfo destSaveFileInfo = BeanUtil.copyProperties(srcFileInfo, EdFileInfo.class);
destSaveFileInfo.newInit();
String fileTime = EleCommonUtil.getNowTimeStr();
String newFileCode = commonService.createFileCode(targetFolderId, srcFileInfo.getFileType(), FILE_START_VERSION, fileTime);
destSaveFileInfo.setParentId(targetFolderId)
.setFileVersion(FILE_START_VERSION)
.setFileTime(fileTime)
.setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + destSaveFileInfo.getId())
.setFileCode(newFileCode);
this.baseMapper.insert(destSaveFileInfo);
// 文件系统移动文件
String srcFilePath = commonService.getFileSysPath(srcFileInfo.getFileId()) + File.separator + srcFileInfo.getFileCode();
String destFilePath = commonService.getFileSysPath(destFolderInfo.getFileId()) + File.separator + destFolderInfo.getFileCode();
fileSystemService.moveFile(srcFilePath, destFilePath);
} else {
handMoveConflict(targetFolderId, strategy, srcFileInfo, destFolderInfo, deleteSrc);
}
// 将以前的版本effect全部置为false删除原目录下的同名文件
if (deleteSrc) {
this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)
.eq(EdFileInfo::getParentId, srcFileInfo.getParentId())
.eq(EdFileInfo::getFileName, srcFileInfo.getFileName())
.eq(EdFileInfo::getFileType, srcFileInfo.getFileType()));
}
return null;
}
/**
* 复制文件
* @param id
* @param targetFolderId
* @return
*/
@Override
public ElectromagneticResult<?> copyFile(String id, String targetFolderId, Integer strategy) {
return moveFile(id, targetFolderId, strategy, false);
}
private void handUploadRepeatFile(String parentId, MultipartFile file, Integer strategy) throws IOException {
Assert.isTrue(Arrays.asList(1, 2, 3).contains(strategy), "解决同名文件参数错误");
String fileName = file.getOriginalFilename();
String mainName = FileUtil.mainName(fileName);
String suffix = FileUtil.getSuffix(fileName);
if (strategy == 2) {
// 版本更新
// step1找到同名文件的MySQL对象
List<EdFileInfo> parentFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getParentId, parentId)
.eq(EdFileInfo::getFileName, mainName)
.eq(EdFileInfo::getFileType, suffix));
EdFileInfo parentFileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getId, parentId)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
Integer maxFileVersion = Collections.max(parentFileInfos, Comparator.comparing(EdFileInfo::getFileVersion)).getFileVersion();
// 找到当前展示的版本
EdFileInfo effectFileInfo = parentFileInfos.stream().filter(e -> e.getEffectFlag().equals(true)).collect(Collectors.toList()).get(0);
String codePathByDbPath = commonService.getCodePathByDbPath(effectFileInfo.getFilePath());
String timeStr = EleCommonUtil.getNowTimeStr();
String fileCode = commonService.createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, timeStr);
// 将原有效的版本置为false
this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)
.eq(EdFileInfo::getId, effectFileInfo.getId()));
// 新增文件
EdFileInfo newEdFileInfo = new EdFileInfo();
newEdFileInfo.newInit();
newEdFileInfo.setFileId(effectFileInfo.getFileId())
.setParentId(parentId)
.setFileCode(fileCode)
.setFileName(mainName)
.setFileType(suffix)
.setFileContent("")
.setFileVersion(maxFileVersion + 1)
.setPreVersion(maxFileVersion)
.setFileNote("")
.setFileTime(timeStr)
.setFileSize(file.getSize())
.setFilePath(parentFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
.setDataType(EleDataTypeEnum.FILE.code)
.setDataStatus(PublishEnum.PUBLISHED.getCode())
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setFileCode(fileCode)
.setPrjDir(false);
this.baseMapper.insert(newEdFileInfo);
String fileDestPath = commonService.getFileSysPath(newEdFileInfo.getFileId()) + File.separator + mainName + suffix + "." + fileCode;
FileUtil.writeFromStream(file.getInputStream(), fileDestPath);
} else if (strategy == 3) {
// 文件名加_1存为新文件
EdFileInfo parentFileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getId, parentId)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
String codePathByDbPath = commonService.getCodePathByDbPath(parentFileInfo.getFilePath());
EdFileInfo newEdFileInfo = new EdFileInfo();
newEdFileInfo.newInit();
String fileCode = commonService.createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, newEdFileInfo.getFileTime());
newEdFileInfo.setParentId(parentId)
.setFileCode(fileCode)
.setFileName(mainName + "_1")
.setFileType(suffix)
.setFileVersion(FILE_START_VERSION)
.setFileTime(newEdFileInfo.getFileTime())
.setFileSize(file.getSize())
.setFilePath(parentFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
.setDataType(EleDataTypeEnum.FILE.code)
.setDataStatus(PublishEnum.PUBLISHED.getCode())
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setFileCode(fileCode)
.setPrjDir(false);
this.baseMapper.insert(newEdFileInfo);
String fileDestPath = commonService.getFileSysPath(parentFileInfo.getFileId()) + File.separator + mainName + "_1." + suffix + "." + fileCode;
FileUtil.writeFromStream(file.getInputStream(), fileDestPath);
}
}
private String doSysFileMerge(String identifier, String fileName, Integer totalChunks) { private String doSysFileMerge(String identifier, String fileName, Integer totalChunks) {
String currentUserId = UserThreadLocal.getUserId(); String currentUserId = UserThreadLocal.getUserId();
for (int i = 1; i <= totalChunks; i++) { for (int i = 1; i <= totalChunks; i++) {

View File

@ -25,6 +25,7 @@ public class FileSystemServiceImpl implements FileSystemService {
@Override @Override
public void save(InputStream inputStream, String destination) { public void save(InputStream inputStream, String destination) {
FileUtil.writeFromStream(inputStream, destination);
} }
@Override @Override

View File

@ -1,5 +1,7 @@
package com.electromagnetic.industry.software.common.util; package com.electromagnetic.industry.software.common.util;
import cn.hutool.core.util.StrUtil;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -35,7 +37,7 @@ public final class EleCommonUtil {
} }
public static boolean isFileNameValid(String fileFullName) { public static boolean isFileNameValid(String fileFullName) {
if (fileFullName.length() > 32) { if (StrUtil.isEmpty(fileFullName) || fileFullName.length() > 32) {
return false; return false;
} }
return pattern.matcher(fileFullName).matches(); return pattern.matcher(fileFullName).matches();