文件恢复,当是单独文件时置为USING即可,当是目录时,除了本身外,还需要将其中的子目录置为USING

文件恢复时,其原本的父目录可能已经被删除,这里就不再去判断,而是采用另一种方案:将恢复文件的父目录统一设置为根目录。

接口信息

路径地址 http://localhost:7090/api/recycle/recoverFile/{ids}
请求方式 PUT
请求参数 ids
返回结果

定义Service

找到 FileInfoService 接口,在其中添加:

FileInfoService
/**
* 批量恢复文件
*
* @param userId 用户ID
* @param ids 需要恢复的文件ID,逗号分隔
*/
void recoverFileBatch(String userId, String ids);

在 UserInfoServiceImpl 中实现该方法

FileInfoServiceImpl
@Override
@Transactional(rollbackFor = Exception.class)
public void recoverFileBatch(String userId, String ids) {
List<String> idList = Arrays.asList(ids.split(","));
LambdaQueryWrapper<FileInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(FileInfo::getUserId, userId)
.eq(FileInfo::getDeleted, FileDelFlagEnums.RECYCLE.getFlag())
.in(!ids.isEmpty(), FileInfo::getId, idList);
List<FileInfo> fileInfoList = list(wrapper);
ArrayList<String> delFileSubFolderFileIdList = new ArrayList<>();
for (FileInfo fileInfo : fileInfoList) {
if (FileFolderTypeEnums.FOLDER.getType().equals(fileInfo.getFolderType())) {
// 查询目录下的所有文件
findAllSubFolderList(delFileSubFolderFileIdList, userId, fileInfo.getId(), FileDelFlagEnums.DEL.getFlag());
}
}
// 查询所有根目录的文件
List<FileInfo> rootFileList = list(new LambdaQueryWrapper<FileInfo>().eq(FileInfo::getUserId, userId)
.eq(FileInfo::getDeleted, FileDelFlagEnums.USING.getFlag())
.eq(FileInfo::getFilePid, Constants.ZERO_STR));
Map<String, FileInfo> rootFileMap = rootFileList.stream().collect(Collectors.toMap(FileInfo::getFilename, Function.identity(), (a, b) -> b));
// 将目录下所有删除的文件更新为使用中
if (!delFileSubFolderFileIdList.isEmpty()) {
FileInfo fileInfo = new FileInfo();
fileInfo.setDeleted(FileDelFlagEnums.USING.getFlag());
baseMapper.updateFileDelFlagBatch(fileInfo, userId, delFileSubFolderFileIdList, null, FileDelFlagEnums.DEL.getFlag());
}
// 将所选文件更新为正常,且父级目录设置为根目录
FileInfo fileInfo = new FileInfo();
fileInfo.setDeleted(FileDelFlagEnums.USING.getFlag());
fileInfo.setFilePid(Constants.ZERO_STR);
fileInfo.setUpdateTime(LocalDateTime.now());
baseMapper.updateFileDelFlagBatch(fileInfo, userId, null, idList, FileDelFlagEnums.RECYCLE.getFlag());

// 将所选文件重命名
for (FileInfo info : fileInfoList) {
FileInfo rootFileInfo = rootFileMap.get(info.getFilename());
// 文件名已存在,重命名
if (null != rootFileInfo) {
FileInfo updateInfo = new FileInfo();
updateInfo.setFilename(StringTools.rename(info.getFilename()));
updateByMultiId(updateInfo, info.getId(), userId);
}
}
}

定义Controller

在 RecycleController 下定义恢复文件方法。

RecycleController
// 恢复文件
@PutMapping("/recoverFile/{ids}")
public void recoverFile(HttpSession session,
@PathVariable("ids") @NotEmpty String ids) {
SessionWebUserVO user = (SessionWebUserVO) session.getAttribute(Constants.SESSION_KEY);
fileInfoService.recoverFileBatch(user.getId(), ids);
}