news 2026/4/16 17:53:26

在JAVA web应用中,如何处理超大附件的分块上传?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在JAVA web应用中,如何处理超大附件的分块上传?

专业开发日记:WebUploader大文件传输系统(信创兼容版)

日期:2023年11月15日 星期三 郑州 晴

项目背景

今日接到客户紧急需求:开发一套支持20G大文件传输的Web系统,需兼容IE8及信创浏览器(龙芯、红莲花、奇安信),支持文件夹层级结构上传/下载,并满足国产化环境要求(统信UOS/中标麒麟/银河麒麟+达梦/人大金仓数据库)。客户强调需免费开源7×24小时支持,且现有开源方案(如WebUploader默认实现)存在文件夹上传缺陷。

技术选型与挑战

  1. 前端框架:JSP + WebUploader(基于Flash兼容IE8,HTML5模式兼容现代浏览器)
  2. 后端:JSP/Servlet(Servlet 3.0异步上传)
  3. 加密传输:SM4(国密) + AES(双协议支持)
  4. 信创适配:通过WebUploader的runtimeOrder配置优先使用flash兼容旧系统
  5. 文件夹上传:需递归解析文件夹结构,生成JSON元数据与文件分片同步传输

核心代码实现

1. 前端配置(JSP页面)
<%@ page contentType="text/html;charset=UTF-8" %> 信创大文件传输系统 选择文件/文件夹 开始上传 var uploader = WebUploader.create({ swf: '/webuploader/Uploader.swf', server: '/upload?action=chunk', pick: { id: '#filePicker', directory: true // 启用文件夹上传 }, formData: { encryptType: 'SM4' // 默认使用SM4加密 }, chunked: true, chunkSize: 5 * 1024 * 1024, // 5MB分片 threads: 3, runtimeOrder: 'flash', // 强制Flash兼容IE8 compress: false }); // 文件夹结构处理 uploader.on('filesQueued', function(files) { files.forEach(file => { if (file.isDir) { // 递归读取文件夹(需配合Flash文件系统API) console.log('检测到文件夹:', file.name); } }); }); // 上传前加密(示例:SM4 ECB模式) uploader.on('uploadBeforeSend', function(block, data) { var key = '1234567890abcdef'; // 实际应从服务端获取 var ciphertext = SM4.encrypt(block.chunk, key); data.ciphertext = ciphertext; });
2. 后端处理(JSP/Servlet)
// UploadServlet.java (Servlet 3.0+)@WebServlet("/upload")@MultipartConfigpublicclassUploadServletextendsHttpServlet{protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringaction=request.getParameter("action");StringencryptType=request.getParameter("encryptType");if("chunk".equals(action)){// 处理分片上传PartfilePart=request.getPart("file");StringchunkIndex=request.getParameter("chunk");StringfileName=request.getParameter("name");// 解密逻辑(示例:AES)if("AES".equals(encryptType)){Stringciphertext=request.getParameter("ciphertext");// byte[] decrypted = AESUtil.decrypt(ciphertext, KEY);// 实际需将解密数据写入临时文件}// 保存分片到临时目录StringtempPath="/tmp/uploads/"+fileName+"_"+chunkIndex;try(InputStreamin=filePart.getInputStream();FileOutputStreamout=newFileOutputStream(tempPath)){byte[]buffer=newbyte[1024];intbytesRead;while((bytesRead=in.read(buffer))!=-1){out.write(buffer,0,bytesRead);}}response.getWriter().write("{\"status\":1}");}}}
3. 文件夹元数据处理
// 前端生成文件夹结构JSONfunctiongenerateFolderMeta(fileEntry){varmeta={name:fileEntry.name,isDir:fileEntry.isDir,children:[]};if(meta.isDir){// 递归读取子文件(需Flash支持)// var reader = fileEntry.createReader();// reader.readEntries(function(entries) {// entries.forEach(entry => {// meta.children.push(generateFolderMeta(entry));// });// });}returnmeta;}// 后端合并分片时重建目录结构// 需在所有分片上传完成后调用合并接口

信创环境适配方案

  1. 浏览器兼容

    • 通过webuploader.flashonly.js强制使用Flash运行时
    • 测试验证:龙芯浏览器(MIPS架构)需Flash插件支持
  2. 操作系统适配

    • 统信UOS:使用Debian包管理安装Java 8 + Tomcat 8
    • 中标麒麟:提供RPM安装包及依赖解决脚本
  3. 数据库适配

    // 达梦数据库连接示例publicclassDMDataSource{publicstaticConnectiongetConnection()throwsSQLException{DriverManager.registerDriver(newdm.jdbc.driver.DmDriver());returnDriverManager.getConnection("jdbc:dm://localhost:5236/DAMENG","SYSDBA","SYSDBA");}}

当前问题与求助

  1. 文件夹上传缺陷

    • WebUploader默认Flash实现无法递归读取子文件夹(需自定义扩展)
    • 信创浏览器对Flash的支持存在差异(红莲花浏览器需额外配置)
  2. 加密性能优化

    • 20G文件加密传输导致内存溢出,需实现流式加密
  3. 断点续传实现

    • 需设计分片校验机制(MD5校验和)

寻求帮助
诚邀熟悉WebUploader源码、信创环境开发的大神加入QQ群:374992201,提供以下支持:

  1. 完善文件夹递归上传逻辑
  2. 协助优化SM4加密性能
  3. 测试跨浏览器兼容性

明日计划

  1. 完成分片合并接口开发
  2. 搭建统信UOS测试环境
  3. 编写国产化数据库适配层

(签名:郑州某高校大三学生 张工)

导入项目

导入到Eclipse:点击查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程

工程

NOSQL

NOSQL示例不需要任何配置,可以直接访问测试

创建数据表

选择对应的数据表脚本,这里以SQL为例

修改数据库连接信息

访问页面进行测试

文件存储路径

up6/upload/年/月/日/guid/filename

效果预览

文件上传

文件刷新续传

支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传

文件夹上传

支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。

下载示例

点击下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:26:07

好写作AI:导师总说“逻辑不通”?让AI当你的论文“首席结构官”!

各位写论文写到后面忘了前面、感觉段落像一群各自为政的散兵游勇、最终被导师一句“逻辑链条断裂”无情击穿的同学们&#xff0c;请举手&#xff01;是不是经常觉得&#xff1a;每个字都认识&#xff0c;每句话都通顺&#xff0c;但拼在一起&#xff0c;连自己都说不清到底想论…

作者头像 李华
网站建设 2026/4/16 16:23:54

基于S7-200组态王3泵变频恒压供水系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于S7-200组态王3泵变频恒压供水系统设计 本设计包括设计报告&#xff0c;PLC程序&#xff0c;组态仿真&#xff0c;I/O接口&#xff0c;带注释程序pdf版&#xff0c;接线图&#xff0c;控制电路图&#xff0c;主电路图272 系统功能: PLC控制变频恒压供水系统关键是主要有变频…

作者头像 李华
网站建设 2026/4/16 14:23:15

糖基化修饰种类和原理介绍

糖基化修饰种类和原理介绍导读图1. N-糖基加工过程四、糖基化修饰分类 哺乳动物中蛋白质的糖基化类型主要可分为两种&#xff1a;N-糖基化和O-糖基化。大多数糖蛋白质只含有一种糖基化类型。但是有些蛋白多肽同时连有N-糖链和O-糖链。 1. N-糖基化 N-糖链通过与蛋白质的天冬氨酸…

作者头像 李华
网站建设 2026/4/16 12:46:45

java_ssm109网上购物推荐系统的设计与实现_idea项目源码

目录具体实现截图项目背景技术架构核心功能创新点应用价值系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 项目背景 随着电子商务的快速发展&#xff0c;个性化推荐系统成为提升用户体验和商业效…

作者头像 李华
网站建设 2026/4/13 2:42:58

数据魔法师书匠策AI:解锁论文写作的“数据炼金术”

在学术江湖中&#xff0c;数据是论文的“黄金矿脉”&#xff0c;但如何从海量数据中提炼出有价值的结论&#xff0c;却让无数研究者陷入“数据沼泽”。今天&#xff0c;我们将揭秘一位隐藏在学术幕后的“数据魔法师”——书匠策AI&#xff0c;它如何用AI技术将复杂的数据分析转…

作者头像 李华
网站建设 2026/4/16 12:56:30

数据魔法师书匠策AI:让论文分析从“技术苦力”变身“学术魔术”

在论文写作的江湖里&#xff0c;数据分析常被视为“技术噩梦”——公式如天书、软件操作复杂、图表不够专业、结果解释没底气……但若有一款工具能像“魔法棒”一样&#xff0c;让数据自动“开口说话”&#xff0c;甚至帮你找到隐藏的研究突破口&#xff0c;你会不会心动&#…

作者头像 李华