news 2026/4/16 17:05:49

网页页面如何设计JSP大文件上传的错误处理机制?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网页页面如何设计JSP大文件上传的错误处理机制?

《一个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 13:33:24

图的基础概念操作与遍历

图 一、图的基础概念与术语概念&#xff1a;图是一种非线性数据结构&#xff0c;由顶点和边组成&#xff0c;相较于线性关系&#xff08;链表&#xff09;和分治关系&#xff08;树&#xff09;&#xff0c;网络关系&#xff08;图&#xff09;的自由度更高&#xff0c;因而更为…

作者头像 李华
网站建设 2026/4/15 20:56:47

wangEditor实现word公式粘贴转MathType格式

企业网站后台管理系统Word集成方案设计与实施 作为河北IT行业集团上市公司项目负责人&#xff0c;针对企业网站后台管理系统文章发布模块的Word集成需求&#xff0c;我进行了全面的技术评估与方案规划。以下是基于集团技术栈和业务需求的完整解决方案。 一、技术选型与产品评…

作者头像 李华
网站建设 2026/4/16 13:33:22

Spring-AI系列——Tool Calling获取当前时间

文章目录一、调用流程二、代码tool包下的TimeTools.java类controller.ZhipuChatClientController.java三、效果四、底层调用情况一、调用流程 二、代码 tool包下的TimeTools.java类 package org.example.tool;import org.springframework.ai.tool.annotation.Tool; import or…

作者头像 李华
网站建设 2026/4/16 13:32:33

探索基于STM32F407VET6的三相PFC技术之旅

基于stm32f407Vet6的三相PFC参考利用dq变换&#xff0c;PID控制&#xff0c;spwm等&#xff0c;知识点非常多&#xff0c;是您学习技术的好帮手&#xff0c;成语完整&#xff0c;并有详细技术文档说明&#xff0c;程序工程可编译&#xff0c;并带有中文注释。在电力电子领域&am…

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

一文搞懂CNN - LSTM - Attention回归预测:新手友好实战

CNN-LSTM-Attention回归&#xff0c;基于卷积神经网络(CNN)-长短期记忆神经网络(LSTM)结合注意力机制(Attention)的数据回归预测&#xff0c;多变量输入单输入&#xff0c;可以更换为时序预测&#xff0c;多变量/单变量都有 LSTM可根据需要更换为BILSTM,GRU 程序已经调试好&…

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

SPSS——判别分析——“一般判别分析”

更多免费教程和软件 :​ 判别分析 【判别分析的概念和目的】 判别分析是一种对观察对象进行分类的统计学方法,它与聚类分析不同,它在分析之前就非常明确观察对象分为几个类别,该分析方法的目的就是从现有已知类别的观察对象中建立一个判别函数来,然后再用该判别函数去判…

作者头像 李华