当前位置: 首页 > 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避免冲突
http://www.xdnf.cn/news/323227.html

相关文章:

  • 部署Prometheus+Grafana简介、监控及设置告警(一)
  • ChromeDriverManager的具体用法
  • uni-app实现完成任务解锁拼图功能
  • 数字康养新范式:七彩喜平台重构智慧养老生态的深度实践
  • 【Python 实战】---- 使用Python批量将 .ncm 格式的音频文件转换为 .mp3 格式
  • 加速项目落地(Trae编辑器)
  • 知识图谱:AI大脑中的“超级地图”如何炼成?
  • MCU缓存架构设计与优化策略
  • 【工具】HandBrake使用指南:功能详解与视频转码
  • IBM BAW(原BPM升级版)使用教程Toolkit介绍
  • MATLAB中去除噪声
  • 安装并运行第一个Spark程序
  • 什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
  • 如何使用UGUI的EventTrigger
  • IT项目实施方案,软件系统实施方案,信息化项目实施方案,软件文档资料(Word)
  • TextIn ParseX重磅功能更新:支持切换公式输出形式、表格解析优化、新增电子档PDF去印章
  • 如何构建直播美颜SDK?从美颜API调用逻辑到GPU优化实战
  • IEC103 转 ModbusTCP 网关
  • 【STM32F1标准库】理论——通信协议:串口
  • 大数据应用开发和项目实战-电商双11美妆数据分析2
  • 扣子(Coze)的记忆系统详解
  • unity 使用蓝牙通讯(PC版,非安卓)
  • linux 安装ssh server
  • 配电站室智能巡检:机器人 VS 固定摄像头,谁更胜一筹?
  • 聊一聊Qwen3思考模式实现以及背后原理探讨
  • 信息论11:从互信息到最大信息系数——信息论中的非线性关联度量
  • 内网和外网怎么互通?外网访问内网的几种简单方式
  • 在cursor中使用MCP插件生成旅行规划到桌面的执行步骤分析
  • PDF文档压缩攻略
  • Python循环进阶:嵌套与控制的深度解析