当前位置: 首页 > news >正文

【EasyPan】saveShare代码分析

【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版

保存分享文件到个人网盘代码分析

一、代码结构概览

该代码实现了一个将他人分享的文件保存到自己网盘的功能,主要分为三个部分:

  1. 控制器层(Controller):处理HTTP请求和响应
  2. 服务层(Service):实现核心业务逻辑
  3. 递归方法:处理目录结构的深度复制

二、控制器层分析

saveShare 方法

@RequestMapping("/saveShare")
@GlobalInterceptor(checkParams = true, checkLogin = false)
public ResponseVO saveShare(HttpSession session,@VerifyParam(required = true) String shareId,@VerifyParam(required = true) String shareFileIds,@VerifyParam(required = true) String myFolderId) {// 验证分享有效性SessionShareDto shareSessionDto = checkShare(session, shareId);// 获取当前用户信息SessionWebUserDto webUserDto = getUserInfoFromSession(session);// 防止自分享操作if (shareSessionDto.getShareUserId().equals(webUserDto.getUserId())) {throw new BusinessException("自己分享的文件无法保存到自己的网盘");}// 调用服务层保存逻辑fileInfoService.saveShare(shareSessionDto.getFileId(), shareFileIds, myFolderId, shareSessionDto.getShareUserId(), webUserDto.getUserId());return getSuccessResponseVO(null);
}

三、服务层分析

saveShare 方法

@Override
public void saveShare(String shareRootFilePid, String shareFileIds, String myFolderId, String shareUserId, String currentUserId) {// 分割文件ID列表String[] shareFileIdArray = shareFileIds.split(",");// 查询目标文件夹现有文件(用于重名检查)FileInfoQuery fileInfoQuery = new FileInfoQuery();fileInfoQuery.setUserId(currentUserId);fileInfoQuery.setFilePid(myFolderId);List<FileInfo> currentFileList = this.fileInfoMapper.selectList(fileInfoQuery);// 构建文件名映射表Map<String, FileInfo> currentFileMap = currentFileList.stream().collect(Collectors.toMap(FileInfo::getFileName, Function.identity(), (data1,data2)->data2));// 查询待保存的分享文件列表fileInfoQuery = new FileInfoQuery();fileInfoQuery.setUserId(shareUserId);fileInfoQuery.setFileIdArray(shareFileIdArray);List<FileInfo> shareFileList = this.fileInfoMapper.selectList(fileInfoQuery);// 准备拷贝文件列表List<FileInfo> copyFileList = new ArrayList<>();Date curDate = new Date();// 处理每个待保存文件for (FileInfo item : shareFileList) {// 处理重名文件FileInfo haveFile = currentFileMap.get(item.getFileName());if (haveFile != null) {item.setFileName(StringTools.rename(item.getFileName()));}// 递归处理文件/目录findAllSubFile(copyFileList, item, shareUserId, currentUserId, curDate, myFolderId);}// 批量插入数据库this.fileInfoMapper.insertBatch(copyFileList);
}

四、递归方法分析

findAllSubFile 方法

private void findAllSubFile(List<FileInfo> copyFileList, FileInfo fileInfo, String sourceUserId, String currentUserId, Date curDate, String newFilePid) {// 保存原始文件ID(用于目录查询)String sourceFileId = fileInfo.getFileId();// 更新文件元信息fileInfo.setCreateTime(curDate);fileInfo.setLastUpdateTime(curDate);fileInfo.setFilePid(newFilePid);fileInfo.setUserId(currentUserId);// 生成新文件IDString newFileId = StringTools.getRandomString(Constants.LENGTH_10);fileInfo.setFileId(newFileId);// 添加到拷贝列表copyFileList.add(fileInfo);// 如果是目录则递归处理子文件if (FileFolderTypeEnums.FOLDER.getType().equals(fileInfo.getFolderType())) {FileInfoQuery query = new FileInfoQuery();query.setFilePid(sourceFileId);query.setUserId(sourceUserId);List<FileInfo> sourceFileList = this.fileInfoMapper.selectList(query);for (FileInfo item : sourceFileList) {findAllSubFile(copyFileList, item, sourceUserId, currentUserId, curDate, newFileId);}}
}

五、安全性和可靠性设计

  1. 参数校验

    • 使用@VerifyParam确保必要参数非空
    • 通过checkShare验证分享有效性
  2. 数据隔离

    • 严格区分shareUserIdcurrentUserId
    • 所有查询都带有用户ID条件
  3. 异常处理

    • 自分享操作抛出明确业务异常
    • 潜在的数据库异常由全局异常处理器捕获
  4. 幂等性设计

    • 重名文件自动重命名
    • 使用新ID避免冲突

相关文章:

  • 企业智能化第一步:用「Deepseek+自动化」打造企业资源管理的智能中枢
  • DSENT (Design Space Exploration of Networks Tool) 配合gem5
  • day 14 SHAP可视化
  • C++:买房子
  • Vue——前端vue3项目使用汉字转拼音
  • #黑马点评#(一)登录功能
  • LangChain第三讲:大模型的输出如何格式化成字符串?
  • 阿里云服务器-宝塔面板安装【保姆级教程】
  • HarmonyOS NEXT深度解析:自研框架ArkUI-X的技术革命与跨平台实践
  • 本地部署 MySQL + Qwen3-1.5B + Flask + Dify 工作流
  • 动态规划-91.解码方法-力扣(LeetCode)
  • SPSS系统发育分析中的聚类相关part
  • 端口安全讲解
  • 《Python星球日记》 第44天: 线性回归与逻辑回归
  • 轻松管理房间预约——启辰智慧预约小程序端使用教程
  • 【图书管理系统】详细讲解用户登录:后端代码实现及讲解、前端代码讲解
  • feign负载均衡
  • 4.系统定时器基本定时器
  • 当“信任”遇上“安全”:如何用Curtain Logtrace记录文件操作活动 守护团队与数据的双重底线?
  • 从Huggingface下载模型的方法小结
  • 体验中国传统文化、采购非遗文创,波兰游客走进上海市群艺馆
  • 中非民间对话在赞比亚举行
  • “毛茸茸”的画,诗意、温暖又治愈
  • 保证断电、碰撞等事故中车门系统能够开启!隐藏式门把手将迎来强制性国家标准
  • 绿城约13.93亿元竞得西安浐灞国际港港务片区地块,区内土地楼面单价首次冲破万元
  • 美联储连续第三次维持利率不变,警示关税影响