news 2026/4/11 6:01:42

WebUploader分块上传在JAVA中的教程分享

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WebUploader分块上传在JAVA中的教程分享

《一个Java老码农的20G文件夹上传历险记》

大家好,我是老王,一个在西安写了15年Java的老程序员。最近接了个外包项目,需求简单概括就是:“用IE9上传20G文件夹,预算100块还要7×24小时支持”——这感觉就像是让我用自行车送外卖,还要求时速120公里!

甲方需求 vs 程序员现实

甲方:“老王啊,我们要做个文件上传系统…”
:“没问题,这个我熟!”
甲方:“要支持20G文件夹上传,保留层级结构,要加密…”
:“小case!”
甲方:“预算100块包干,含源码文档和技术支持…”
:“老板,我突然想起我家煤气灶还没关…”

// 预算检测工具类publicclassBudgetValidator{publicstaticvoidcheck(doublebudget){if(budget<10000){thrownewInsufficientBudgetException("您的预算仅够买"+(int)(budget/3)+"杯蜜雪冰城");}}}

技术选型(贫穷版)

前端方案

  1. IE9兼容:使用`` + 递归读取
  2. 大文件上传:分片上传 + 本地存储记录进度
  3. 加密:在内存中加密后上传(AES/SM4)
// IE9文件夹上传核心代码functionhandleIEFolderUpload(files){if(!files){alert('请使用Chrome浏览器以获得更好体验(或者加钱)');return;}letfileCount=0;for(leti=0;i<files.length;i++){constfile=files[i];// 假装处理了文件夹结构constfakePath=file.name.replace(/\\/g,'/');uploadFile(file,fakePath);fileCount++;}console.log(`成功上传了${fileCount}个文件(可能丢失了层级关系)`);}

后端方案

  1. SpringBoot:接收分片文件
  2. 阿里云OSS:直传 + 分片合并
  3. 数据库:记录文件树结构
// 文件信息实体(丐版)@EntitypublicclassFileInfo{@IdprivateStringid;privateStringfileName;privateStringfilePath;// 例如 "/root/folder1/file.txt"privateLongfileSize;privateBooleanisDirectory;// 省去getter/setter...}// 上传控制器(简化版)@RestController@RequestMapping("/api/upload")publicclassUploadController{@PostMappingpublicStringupload(@RequestParamMultipartFilefile,@RequestParamStringrelativePath){// 1. 加密存储(假装很安全)byte[]encrypted=encrypt(file.getBytes());// 2. 保存到阿里云OSSStringossPath="user_uploads/"+UUID.randomUUID();ossClient.putObject(bucketName,ossPath,newByteArrayInputStream(encrypted));// 3. 记录文件结构FileInfofileInfo=newFileInfo();fileInfo.setFilePath(relativePath);fileRepository.save(fileInfo);return"success";}privatebyte[]encrypt(byte[]data){// 这里应该用AES/SM4,但预算只够写个伪代码returndata;// 假装加密了}}

文件夹结构保持方案

前端处理

// 递归读取文件夹(现代浏览器)asyncfunctionreadDirectory(directory){constfiles=[];forawait(constentryofdirectory.values()){if(entry.isDirectory){constsubFiles=awaitreadDirectory(entry);subFiles.forEach(f=>{f.relativePath=entry.name+'/'+f.relativePath;files.push(f);});}else{files.push({file:awaitentry.getFile(),relativePath:entry.name});}}returnfiles;}

后端存储

-- 文件结构存储表CREATETABLE`file_structure`(`id`varchar(64)NOTNULL,`file_name`varchar(255)NOTNULL,`file_path`varchar(1024)NOTNULLCOMMENT'完整路径如/root/folder/file.txt',`parent_id`varchar(64)DEFAULTNULLCOMMENT'父目录ID',`is_directory`tinyint(1)NOTNULLDEFAULT'0',PRIMARYKEY(`id`),KEY`idx_parent`(`parent_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

断点续传实现

前端关键代码

// 断点续传管理器classResumeUploader{constructor(){this.chunks={};}// 开始上传asyncupload(file){constfileId=this.generateFileId(file);constchunkSize=5*1024*1024;// 5MB分片constchunks=Math.ceil(file.size/chunkSize);// 从本地恢复进度constsavedProgress=localStorage.getItem(`upload_${fileId}`);if(savedProgress){this.chunks[fileId]=JSON.parse(savedProgress);}else{this.chunks[fileId]={uploaded:0,total:chunks};}// 上传剩余分片for(leti=this.chunks[fileId].uploaded;i<chunks;i++){constchunk=file.slice(i*chunkSize,(i+1)*chunkSize);awaitthis.uploadChunk(fileId,chunk,i);// 更新进度this.chunks[fileId].uploaded++;localStorage.setItem(`upload_${fileId}`,JSON.stringify(this.chunks[fileId]));}}}

后端分片处理

// 分片上传控制器@RestController@RequestMapping("/api/chunk")publicclassChunkUploadController{@PostMappingpublicStringuploadChunk(@RequestParamStringfileId,@RequestParamIntegerchunkNumber,@RequestParamMultipartFilechunk){// 1. 临时存储分片StringchunkPath="/tmp/uploads/"+fileId+"/"+chunkNumber;Files.write(Paths.get(chunkPath),chunk.getBytes());// 2. 检查是否所有分片都上传完成if(isUploadComplete(fileId)){mergeChunks(fileId);}return"success";}privatebooleanisUploadComplete(StringfileId){// 这里应该查询数据库或文件系统// 但预算只够返回truereturntrue;}}

浏览器兼容处理(重点照顾IE9)

// 浏览器兼容层constFileUploader={// 现代浏览器上传modernUpload:async(files)=>{// 使用File API实现},// IE9专属上传ie9Upload:(files)=>{// 使用ActiveXObject实现try{constfso=newActiveXObject("Scripting.FileSystemObject");alert("检测到您在使用IE9,建议:\n1. 升级浏览器\n2. 加钱");returnthis.fakeUpload(files);}catch(e){alert("IE9都没装全?您这预算是不是该再加个0?");}},// 假装上传成功fakeUpload:(files)=>{return{success:true,message:"上传成功(可能丢失了部分文件)"};}};

部署方案(100元特别版)

# 部署脚本:budget_deploy.shecho"正在部署价值100元的20G文件上传系统..."echo"1. 关闭所有安全组规则(省防火墙钱)"echo"2. 使用阿里云最便宜实例(共享型xn4)"echo"3. 数据库使用本地MySQL(省RDS钱)"echo"4. 关闭所有日志记录(省磁盘钱)"echo"部署完成!记得每天凌晨3点手动重启释放内存!"

给同行的忠告

兄弟们,这个需求我最后是这么处理的:

  1. 用WebUploader的文件夹上传功能(IE9用Flash方案)
  2. 层级结构用字符串路径保存
  3. 断点续传用localStorage+服务端记录
  4. 加密?跟甲方说"肉眼不可见的量子加密"

最后报价单:

  • 基础功能:100元
  • IE9兼容:加个0
  • 20G支持:再加个0
  • 7×24支持:继续加0

最终我决定:把甲方推荐给了群里做前端的张老三,自己拿20%介绍费美滋滋!


欢迎加入我们"夕阳红程序员接单群"(QQ:374992201),群里定期分享:

  1. 《如何委婉拒绝甲方》话术大全
  2. 《从Java到烧烤摊》转型指南
  3. 价值百万的"文件上传系统"源码(限时特价99元)

现在入群还能参与"最惨甲方需求"评选大赛,冠军将获得:

  • 老王的二手机械键盘一个(空格键不太灵)
  • 价值连城的《程序员防脱发指南》电子版
  • 群内大佬免费职业规划咨询一次(可能建议你转行)

导入项目

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

工程

NOSQL

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

创建数据表

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

修改数据库连接信息

访问页面进行测试

文件存储路径

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

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

下载示例

点击下载完整示例

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

JAVA大文件分块上传的加密存储解决方案

作为国内专注于设计制造领域的软件厂商&#xff0c;近期我们正积极投身于大文件上传下载组件的调研工作。在当前业务场景下&#xff0c;我们有着明确且极具挑战性的需求&#xff1a;所选取的组件必须能够支持高达 100G 文件以及文件夹的上传下载功能&#xff0c;同时要全面适配…

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

5个终极技巧:用Lively Wallpaper彻底改造你的桌面体验

5个终极技巧&#xff1a;用Lively Wallpaper彻底改造你的桌面体验 【免费下载链接】lively Free and open-source software that allows users to set animated desktop wallpapers and screensavers powered by WinUI 3. 项目地址: https://gitcode.com/gh_mirrors/li/livel…

作者头像 李华
网站建设 2026/4/8 9:17:59

Markdown引用块使用:突出TensorFlow权威资料来源

Markdown引用块使用&#xff1a;突出TensorFlow权威资料来源 在AI工程实践中&#xff0c;一个常见的痛点是“环境不一致”——开发者常说的“在我机器上能跑”&#xff0c;到了同事或生产环境却频频报错。这种问题往往源于深度学习框架、CUDA驱动、Python版本之间复杂的依赖关…

作者头像 李华
网站建设 2026/3/31 18:32:50

Node.js与PaddleOCR深度整合:打造企业级智能文字识别解决方案

Node.js与PaddleOCR深度整合&#xff1a;打造企业级智能文字识别解决方案 【免费下载链接】PaddleOCR 飞桨多语言OCR工具包&#xff08;实用超轻量OCR系统&#xff0c;支持80种语言识别&#xff0c;提供数据标注与合成工具&#xff0c;支持服务器、移动端、嵌入式及IoT设备端的…

作者头像 李华
网站建设 2026/4/10 5:40:03

SSH连接超时怎么办?保持TensorFlow远程会话长期运行

SSH连接超时怎么办&#xff1f;保持TensorFlow远程会话长期运行 在深度学习项目中&#xff0c;训练一个模型动辄需要数小时甚至数天。你可能已经习惯了这样的节奏&#xff1a;启动训练脚本、确认GPU正常加载、然后安心地合上笔记本&#xff0c;准备第二天查看结果。但当你再次打…

作者头像 李华