news 2026/4/17 19:21:51

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/16 15:55:41

【量子计算开发者必看】:基于C语言的qubit状态演化模拟全解析

第一章&#xff1a;量子计算与C语言模拟概述量子计算作为下一代计算范式的前沿领域&#xff0c;利用量子比特&#xff08;qubit&#xff09;的叠加态与纠缠特性&#xff0c;能够在特定问题上实现远超经典计算机的运算能力。尽管目前通用量子计算机仍处于发展阶段&#xff0c;但…

作者头像 李华
网站建设 2026/4/17 16:49:34

Lively Wallpaper终极指南:3步打造你的动态桌面艺术空间

Lively Wallpaper终极指南&#xff1a;3步打造你的动态桌面艺术空间 【免费下载链接】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/liv…

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

Nextcloud架构深度解析:从源码看云端文件管理实战

Nextcloud架构深度解析&#xff1a;从源码看云端文件管理实战 【免费下载链接】server ☁️ Nextcloud server, a safe home for all your data 项目地址: https://gitcode.com/GitHub_Trending/se/server 技术架构核心剖析 Nextcloud的文件管理架构建立在多层抽象之上…

作者头像 李华
网站建设 2026/4/6 9:28:45

终极指南:Lively Wallpaper性能瓶颈突破与硬件兼容性深度解析

终极指南&#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/l…

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

【计算机毕业设计案例】基于SpringBoot的动物园 游客服务管理系统的设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/6 13:53:19

MTranServer 私有翻译服务器部署实战指南

想要拥有一个低资源消耗、响应快速的私有翻译服务吗&#xff1f;MTranServer作为开源版Google翻译的替代方案&#xff0c;让您可以在本地环境中轻松部署专业级翻译服务&#xff0c;完美解决数据安全和网络延迟问题。 【免费下载链接】MTranServer Low-resource, fast, and priv…

作者头像 李华