前言
- 该Easy云盘非原创,原作者为B站程序员老罗;
- B站项目学习链接:Springboot项目实战 easypan 仿百度网盘 计算机毕业设计 简历项目 项目经验(后端);
- 本人不分享本项目源码 ,只记录项目日记,学习项目技术思路,支持项目付费;
- 该项目难点:上传文件(大文件的分片与合并、视频文件的分片)、删除文件到回收站(文件夹的递归遍历)、恢复回收站的文件(注意文件命名重复问题)、分享文件(生成分享链接、下载文件);
文章目录
4.3.7获取当前目录的文件信息(文件id+文件名)
(1)接口
获取当前目录接口:POST
http://localhost:7090/api/file/getFolderInfo
编码方式:
multipart/form-data
Body请求参数:
请求成功结果:
{ "status": "success", "code": 200, "info": "请求成功", "data": [ { "fileName": "22222", "fileId": "o4rnme9FB3" }, { "fileName": "23232323", "fileId": "lYf7edaqUi" } ] }
(2)FolderVO
@Data
public class FolderVO {
private String fileName;
private String fileId;
}
(3)controller层
@RequestMapping("/getFolderInfo")
@GlobalInterceptor(checkParams = true)
public ResponseVO getFolderInfo(HttpSession session,
@VerifyParam(required = true) String path) {
return super.getFolderInfo(path, getUserInfoFromSession(session).getUserId());
}
(4)service层
public ResponseVO getFolderInfo(String path, String userId) {
String[] pathArray = path.split("/");
FileInfoQuery infoQuery = new FileInfoQuery();
infoQuery.setUserId(userId);
infoQuery.setFolderType(FileFolderTypeEnums.FOLDER.getType());
infoQuery.setFileIdArray(pathArray);
String orderBy = "field(file_id,\"" + org.apache.commons.lang3.StringUtils.join(pathArray, "\",\"") + "\")";
infoQuery.setOrderBy(orderBy);
List<FileInfo> fileInfoList = fileInfoService.findListByParam(infoQuery);
return getSuccessResponseVO(CopyTools.copyList(fileInfoList, FolderVO.class));
}
4.3.8文件重命名
(1)接口
文件重命名接口:POST
http://localhost:7090/api/file/rename
编码格式:
multipart/form-data
Body请求参数:
(2)controller层
@RequestMapping("/rename")
@GlobalInterceptor(checkParams = true)
public ResponseVO rename(HttpSession session,
@VerifyParam(required = true) String fileId,
@VerifyParam(required = true) String fileName) {
SessionWebUserDto webUserDto = getUserInfoFromSession(session);
FileInfo fileInfo = fileInfoService.rename(fileId, webUserDto.getUserId(), fileName);
return getSuccessResponseVO(CopyTools.copy(fileInfo, FileInfoVO.class));
}
(3)service层
- 根据文件id、用户id查询文件是否存在,不存在则立即返回;
- 若新文件名与原文件名相同,则返回文件信息;
- 检查目录下是否有与新文件名相同的文件,有的话则抛出异常;
- 插进数据库后,再次检查是否查到相同的两个文件信息,若有则抛出异常,进行回滚;(避免同一用户在同一时间对同一目录下的文件进行一样的重命名操作)
@Override
@Transactional(rollbackFor = Exception.class)
public FileInfo rename(String fileId, String userId, String fileName) {
FileInfo fileInfo = this.fileInfoMapper.selectByFileIdAndUserId(fileId, userId);
if (fileInfo == null) {
throw new BusinessException("文件不存在");
}
if (fileInfo.getFileName().equals(fileName)) {
return fileInfo;
}
String filePid = fileInfo.getFilePid();
checkFileName(filePid, userId, fileName, fileInfo.getFolderType());
//文件获取后缀
if (FileFolderTypeEnums.FILE.getType().equals(fileInfo.getFolderType())) {
fileName = fileName + StringUtils.getFileSuffix(fileInfo.getFileName());
}
Date curDate = new Date();
FileInfo dbInfo = new FileInfo();
dbInfo.setFileName(fileName);
dbInfo.setLastUpdateTime(curDate);
this.fileInfoMapper.updateByFileIdAndUserId(dbInfo, fileId, userId);
FileInfoQuery fileInfoQuery = new FileInfoQuery();
fileInfoQuery.setFilePid(filePid);
fileInfoQuery.setUserId(userId);
fileInfoQuery.setFileName(fileName);
fileInfoQuery.setDelFlag(FileDelFlagEnums.USING.getFlag());
Integer count = this.fileInfoMapper.selectCount(fileInfoQuery);
if (count > 1) {
throw new BusinessException("文件名" + fileName + "已经存在");
}
fileInfo.setFileName(fileName);
fileInfo.setLastUpdateTime(curDate);
return fileInfo;
}
- 检查目录下是否有与新文件名相同的文件:
private void checkFileName(String filePid, String userId, String fileName, Integer folderType) {
FileInfoQuery fileInfoQuery = new FileInfoQuery();
fileInfoQuery.setFolderType(folderType);
fileInfoQuery.setFileName(fileName);
fileInfoQuery.setFilePid(filePid);
fileInfoQuery.setUserId(userId);
fileInfoQuery.setDelFlag(FileDelFlagEnums.USING.getFlag());
Integer count = this.fileInfoMapper.selectCount(fileInfoQuery);
if (count > 0) {
throw new BusinessException("此目录下已存在同名文件,请修改名称");
}
}