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

java分片上传/合并

本文介绍了文件分片上传与合并的实现代码。Controller层通过Rchunk方法接收分片数据并调用Service层处理,Service层使用ChunkUtils.createChunk保存分片文件。分片信息通过ChunkUploadDTO实体类传输,包含文件MD5、分片索引等字段。合并时先验证分片完整性,再通过mergeChunks方法将所有分片按顺序合并为完整文件,合并完成后删除临时分块。代码采用try-with-resources确保流关闭,并通过日志记录异常情况。

  • Controller层分片代码

public R chunk(ChunkUploadDTO dto) throws IOException { chunkService.chunk(dto); return new R<>(0,"Upload success!"); }
  • Service层分片代码

public void chunk(ChunkUploadDTO dto) { try { dto.setUploadRootDir("分片保存路径"); ChunkUtils.createChunk(dto); } catch (Exception e) { e.printStackTrace(); } }
  • ChunkUploadDTO分片/合并实体类代码

@Data public class ChunkUploadDTO { /** 文件唯一标识(MD5) */ private String fileMd5; /** 分片索引(从0开始) */ private Integer chunkIndex; /** 总分片数 */ private Integer chunkCount; /** 原文件名 */ private String fileName; /** 分片文件 */ private MultipartFile chunkFile; private Integer totalChunks; // 总分片数 private String uploadRootDir; }
  • Controller层合并代码

@PostMapping("接口名") @LogApi(logType = LogType.IN, logOperation = "合并大文件", isLogParams = false, isLogDetail = false) public R merge(ChunkUploadDTO dto) { return mergeService.merge(dto); }
  • Service层合并代码

public R merge(ChunkUploadDTO dto) { try { String RootDir = ChunkUtils.merge("合并路径", dto.getFileMd5(), dto.getTotalChunks(), dto.getFileName()); return new R<>(RootDir ); } catch (Exception e) { e.printStackTrace(); log.error("扫描入库异常:[{}]", e.getMessage()); return new R<>(486); } }
  • ChunkUtil类

public static String merge(String uploadRootDir,String fileMd5,Integer totalChunks,String fileName) throws Exception { // 验证所有分块是否完整 if (!validateChunks(uploadRootDir, fileMd5, totalChunks)) { log.info("Chunk incomplete"); } // 合并分块 mergeChunks(uploadRootDir + File.separatorChar, fileMd5 + File.separatorChar, fileName, totalChunks); String scanningRootDir = uploadRootDir + File.separatorChar + fileMd5 + File.separatorChar + fileName; return scanningRootDir; } private static void mergeChunks(String chunkDir, String fileDir, String fileName, int totalChunks) throws IOException { String address = chunkDir + fileDir + fileName; File outputFile = new File(address); try (FileOutputStream fos = new FileOutputStream(outputFile, false)) { for (int i = 0; i < totalChunks; i++) { File chunkFile = new File(chunkDir + fileDir + i); Files.copy(chunkFile.toPath(), fos); chunkFile.delete(); // 删除临时分块 } } }
http://www.cnnetsun.cn/news/2775860.html

相关文章:

  • AI智能体与领域模型微调建设项目
  • 【国家级智慧社区认证必过清单】:AI工具合法性、隐私计算合规性、实时响应SLA三重校验表(附可下载模板)
  • Python信用评分卡终极指南:从零开始构建专业风险模型
  • 拥抱 Vibe Coding:重构一个现代化智能语音助手 (ClearVoice-ASR)
  • AI大佬跨阵营联合呼吁:美国立法强制筛查合成DNA订单,防范生物安全风险
  • PoE网络变压器中共模扼流圈(CMC)的放置与磁饱和问题解析
  • 反激电源同步整流改造实战:基于BM1R001xxF的完整设计与调试指南
  • MASA模组全家桶汉化包:中文玩家的终极解决方案
  • 深圳艾景特科技:开发者猫叔如何打造面向中国市场的 AI 投研产品
  • AirDisk NAS Viewer 通过 HTTP 服务或 Windows 网络驱动器
  • 如何免费搭建专业数字标牌系统?LibreSignage开源方案终极指南
  • Kotlin MVVM 实战入门:从分层到状态闭环
  • 黑洞冕区湍流等离子体特性与粒子加速机制研究
  • 从网表文件到仿真曲线:HSPICE新手入门,手把手教你跑通第一个TFT仿真
  • 【AI工具TCO精准压降术】:从License拆分、用量归因到跨平台套利,实测年省$186,400
  • 用OpenCV3.14复现经典Snake算法:从能量函数到代码实现的保姆级教程
  • NanaZip:重新定义Windows文件压缩体验的7个突破性功能
  • 硬件设计避坑:为什么你算的基极电阻总让三极管关不断?从MMBT3904实测曲线说起
  • spaCy实战指南:构建稳定可解释的NLP生产流水线
  • Delta Lake删除向量(Deletion Vectors)原理与实战指南
  • Dell服务器S系列软RAID管理:除了创建,你更该知道的磁盘交换与状态监控技巧
  • 斯坦福 AI Agent Harness Engineering 研究再突破:自主学习能力接近人类水平
  • 从地铁换乘到算法设计:如何用DFS模拟现实出行规划(以PAT‘周游世界’题为例)
  • M2.7国产大模型:开箱即用的工程化推理实践
  • 别再混用了!手把手教你用STM32CubeMX搞定DHT11和DHT22(附代码避坑)
  • 如何快速掌握Detect-It-Easy:安全研究者的终极文件分析指南
  • 宽温大功率输出,LDMN-GM7 助力矿区雷达性能验收工作
  • Inter字体:免费开源字体为现代数字界面设计的完整指南
  • 实战演练:利用Cursor设计+快马实现,快速打造一个可用的天气查询应用
  • aifei学习前置基础:全套完整教程:Anaconda 安装→环境配置→YOLOv8+OpenCV 安装 + OpenCV 实操 + 标注→训练→导出→部署