芯片制造SpringBoot如何实现大文件上传?
开发者日记2023年11月25日 周六 阴项目名称跨平台大文件传输系统WebUploaderVue3SpringBoot腾讯云COS项目背景与核心挑战作为河南独立开发者近期承接了一个高复杂度外包项目客户要求实现20G级文件/文件夹跨浏览器上传下载技术栈涉及前端Vue3TypeScript WebUploader兼容IE8后端SpringBoot 3.0 Oracle 21c存储腾讯云COS需处理分片上传与合并兼容性从IE8到现代浏览器Chrome/Firefox/Safari/Edge/Opera现存痛点网上开源方案仅支持单文件上传无完整文件夹层级解析逻辑IE8的ActiveX控件在Windows 11上频繁崩溃Oracle数据库与MySQL的序列化差异导致进度存储失败20G文件传输时SpringBoot默认超时时间1分钟严重不足技术方案设计前端架构Vue3 WebUploaderChrome/FirefoxIE8用户选择文件/文件夹浏览器类型使用FileSystemDirectoryHandle API调用ActiveX控件递归读取生成文件树结构JSON计算文件ETag替代MD5兼容IE8分片上传WebUploader本地存储进度IndexedDBlocalStorage后端架构SpringBoot Oracle是否是否接收分片是否首片创建Oracle任务记录序列BLOB更新分片进度JDBC批处理存储分片到临时目录是否全部分片完成合并文件并上传COS返回继续上传指令关键数据库设计Oracle-- 上传任务表CREATETABLEUPLOAD_TASK(TASK_ID VARCHAR2(36)PRIMARYKEY,FILE_ETAG VARCHAR2(64)NOTNULL,RELATIVE_PATH VARCHAR2(1024),-- 保留文件夹层级如 /project/src/TOTAL_CHUNKS NUMBER,UPLOADED_CHUNKS NUMBERDEFAULT0,STATUSVARCHAR2(20)CHECK(STATUSIN(PENDING,UPLOADING,COMPLETED,FAILED)),COS_KEY VARCHAR2(1024),CREATE_TIMETIMESTAMPDEFAULTSYSTIMESTAMP);-- 分片存储表Oracle BLOB优化CREATETABLEUPLOAD_CHUNK(CHUNK_ID VARCHAR2(72)PRIMARYKEY,-- TASK_IDCHUNK_INDEXTASK_ID VARCHAR2(36)REFERENCESUPLOAD_TASK(TASK_ID),CHUNK_INDEX NUMBER,CHUNK_DATABLOB,CONSTRAINTUK_TASK_CHUNKUNIQUE(TASK_ID,CHUNK_INDEX));核心代码实现前端文件夹上传与断点续传Vue3 TypeScript// src/components/FolderUploader.vueimport{ref,onMounted}fromvue;importWebUploaderfromwebuploader;import{calculateFileETag}from/utils/fileHash;// 自定义ETag计算兼容IE8exportdefault{setup(){consttaskListref([]);constuploaderref(null);// 初始化上传器兼容IE8constinitUploader(){constisIE8document.documentMode8;uploader.valueWebUploader.create({swf:/static/Uploader.swf,// IE8回退server:/api/upload/chunk,chunked:true,chunkSize:isIE8?4*1024*1024:20*1024*1024,// IE8限制4MB分片threads:isIE8?1:5,formData:{taskId:localStorage.getItem(currentTaskId)||},timeout:0// 禁用超时由后端控制});// 恢复未完成任务从IndexedDBrestoreTasksFromDB();};// 递归解析文件夹跨浏览器consthandleFolderSelectasync(e:Event){constinpute.targetasHTMLInputElement;constfilesinput.files;if(!files?.length)return;constparseFolderasync(entries:FileSystemEntry[],parentPath){for(letentryofentries){if(entry.isFile){constfile(entryasFileSystemFileEntry).file!;constrelativePathparentPath?${parentPath}/${entry.name}:entry.name;awaitaddUploadTask(file,relativePath);}elseif(entry.isDirectory){constdirReader(entryasFileSystemDirectoryEntry).createReader();constnewEntriesawaitnewPromise(resolve{dirReader.readEntries(resolve);});awaitparseFolder(newEntries,parentPath?${parentPath}/${entry.name}:entry.name);}}};// Chrome/Firefox使用showDirectoryPickerif(files[0].webkitGetAsEntry){constentryfiles[0].webkitGetAsEntry();if(entry?.isDirectory){constdirReaderentry.createReader();constentriesawaitnewPromise(resolve{dirReader.readEntries(resolve);});awaitparseFolder(entries);}else{awaitaddUploadTask(files[0],files[0].name);}}// IE8使用ActiveX需用户授权elseif(window.ActiveXObject){// ActiveX实现代码省略需处理权限弹窗}};// 添加上传任务constaddUploadTaskasync(file:File,relativePath:string){constetagawaitcalculateFileETag(file);// 使用CRC32文件大小替代MD5consttask{file,relativePath,etag,chunkCount:Math.ceil(file.size/uploader.value!.options.chunkSize),uploadedChunks:0};// 检查本地是否有未完成记录constexistingTaskawaitgetTaskFromDB(etag);if(existingTask){task.uploadedChunksexistingTask.uploadedChunks;}taskList.value.push(task);saveTaskToDB(task);startUpload(task);};onMounted((){initUploader();document.getElementById(folderInput)?.addEventListener(change,handleFolderSelect);});return{taskList,uploader};}};后端SpringBoot分片处理与COS上传// src/main/java/com/example/uploader/controller/UploadController.javaRestControllerRequestMapping(/api/upload)publicclassUploadController{AutowiredprivateUploadTaskRepositorytaskRepository;AutowiredprivateUploadChunkRepositorychunkRepository;AutowiredprivateCOSClientcosClient;// 腾讯云COS客户端// 分片上传接口PostMapping(/chunk)publicResponseEntityhandleChunk(RequestParam(file)MultipartFilefile,RequestParam(taskId)StringtaskId,RequestParam(chunkIndex)intchunkIndex,RequestParam(totalChunks)inttotalChunks,RequestParam(etag)Stringetag,RequestParam(relativePath)StringrelativePath){// 1. 查询或创建任务UploadTasktasktaskRepository.findById(taskId).orElseGet(()-{UploadTasknewTasknewUploadTask();newTask.setTaskId(taskId);newTask.setFileEtag(etag);newTask.setRelativePath(relativePath);newTask.setTotalChunks(totalChunks);newTask.setStatus(UPLOADING);returntaskRepository.save(newTask);});// 2. 保存分片到Oracle BLOBUploadChunkchunknewUploadChunk();chunk.setChunkId(taskId_chunkIndex);chunk.setTaskId(taskId);chunk.setChunkIndex(chunkIndex);try{chunk.setChunkData(file.getBytes());chunkRepository.save(chunk);}catch(IOExceptione){returnResponseEntity.status(500).body(分片保存失败);}// 3. 更新任务进度task.setUploadedChunks(chunkIndex1);taskRepository.save(task);// 4. 检查是否全部上传完成if(task.getUploadedChunks()task.getTotalChunks()){// 启动异步合并任务mergeAndUploadToCOS(task);returnResponseEntity.ok({\status\:\COMPLETED\});}returnResponseEntity.ok({\status\:\SUCCESS\});}// 异步合并并上传COSAsyncpublicvoidmergeAndUploadToCOS(UploadTasktask){try{// 1. 从Oracle读取所有分片ListchunkschunkRepository.findByTaskIdOrderByChunkIndex(task.getTaskId());// 2. 合并文件流式处理避免内存溢出PathtempFileFiles.createTempFile(upload_,.tmp);try(OutputStreamoutFiles.newOutputStream(tempFile)){for(UploadChunkchunk:chunks){out.write(chunk.getChunkData());}}// 3. 上传到腾讯云COSStringcosKeyuploads/task.getTaskId()/task.getRelativePath();cosClient.putObject(newPutObjectRequest(your-bucket,cosKey,tempFile.toFile()));// 4. 更新任务状态task.setStatus(COMPLETED);task.setCosKey(cosKey);taskRepository.save(task);// 5. 清理临时文件和分片Files.deleteIfExists(tempFile);chunkRepository.deleteByTaskId(task.getTaskId());}catch(Exceptione){task.setStatus(FAILED);taskRepository.save(task);}}}关键问题解决IE8兼容性使用标签替代已废弃的加载Uploader.swf通过document.execCommand(SaveAs)实现IE8的下载功能Oracle性能优化对UPLOAD_CHUNK表的TASK_ID字段建立索引使用JDBC批处理更新进度addBatch()executeBatch()大文件传输超时在SpringBoot配置中增加server:tomcat:connection-timeout:0# 禁用连接超时spring:servlet:multipart:max-file-size:20GBmax-request-size:20GB文件夹层级保留前端传递relativePath参数如/docs/2023/report.pdf后端直接存储该路径上传COS时保持原样求助与社区支持目前遇到以下难题已在QQ群374992201发布详细日志IE8的ActiveX控件在Windows 11上频繁弹出权限警告Oracle BLOB存储20G文件时出现ORA-01653表空间不足错误SpringBoot异步任务在合并大文件时被K8s容器终止完整代码仓库前端https://gitee.com/yourname/vue3-folder-uploader后端https://gitee.com/yourname/springboot-cos-uploader明日计划实现WebUploader的IE8进度条显示编写Oracle分片表的分区策略按任务ID哈希分区测试20G文件在低带宽2Mbps下的传输稳定性日记结束附技术栈对比表模块原方案当前方案优化点前端框架jQueryVue3 TypeScript类型安全组件化上传组件WebUploader基础版定制版支持文件夹ETag递归解析文件夹结构后端语言JSPSpringBoot 3.0响应式编程Oracle优化数据库MySQLOracle 21cBLOB存储优化分区表对象存储百度OBS腾讯云COS适配不同的分片API规范如需完整项目或调试协助请联系QQ群或留言获取测试账号SQL示例创建数据库配置数据库连接自动下载maven依赖启动项目启动成功访问及测试默认页面接口定义在浏览器中访问数据表中的数据效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。批量下载支持文件批量下载下载续传文件下载支持离线保存进度信息刷新页面关闭页面重启系统均不会丢失进度信息。文件夹下载支持下载文件夹并保留层级结构不打包不占用服务器资源。示例下载下载完整示例

相关新闻

医疗系统SpringMVC如何处理大文件上传?

医疗系统SpringMVC如何处理大文件上传?

咱福州软件工程狗实锤了!最近为了毕设焦头烂额——要做个能打的大文件管理系统,还要支持10G上传、断点续传、加密啥的,关键是得兼容IE8这种“古董”浏览器(学校机房那台Win7IE9的老机器,点个按钮都像在蹦迪&#xff09…

2026/7/5 0:24:29 阅读更多 →
2026年如何学习网络安全?网络安全学习路线

2026年如何学习网络安全?网络安全学习路线

学习网络安全是一个系统且逐步深入的过程,以下是一个较为全面的网络安全学习路线,适合初学者和有经验的专业人士进一步提升技能: 一、基础知识阶段 1.1 计算机基础 操作系统:熟悉Windows和Linux的基本操作、文件系统、进程管理、…

2026/7/7 12:05:21 阅读更多 →
软件测试VS网络安全渗透测试,聊聊软测转网安渗透测试那些事儿

软件测试VS网络安全渗透测试,聊聊软测转网安渗透测试那些事儿

软件测试工程师 软件测试方法的分类: 从程序执行的方式来分类,可分为: 人工测试(Manual Testing,MT) 自动化测试(Automatic Testing,AT) 以具体实现算法细节和系统内部结…

2026/7/10 8:59:29 阅读更多 →

最新新闻

PIC18LF47K40驱动CMT-8540S-SMT蜂鸣器的嵌入式音频设计

PIC18LF47K40驱动CMT-8540S-SMT蜂鸣器的嵌入式音频设计

1. 为什么选择PIC18LF47K40与CMT-8540S-SMT组合 在嵌入式音频项目中,微控制器与音频输出器件的选型直接影响最终效果和开发效率。PIC18LF47K40作为Microchip旗下经典的低功耗8位MCU,其内置的PWM模块和灵活的时钟系统特别适合驱动CMT-8540S-SMT这类磁性蜂…

2026/7/11 3:07:48 阅读更多 →
【大数据毕业设计】基于 Python 的微博热搜情感倾向可视化系统的设计与实现 基于 Python 的热门微博时序趋势研判系统(源码+文档+远程调试,全bao定制等)

【大数据毕业设计】基于 Python 的微博热搜情感倾向可视化系统的设计与实现 基于 Python 的热门微博时序趋势研判系统(源码+文档+远程调试,全bao定制等)

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

2026/7/11 3:05:47 阅读更多 →
ADS131M02与PIC18F87J10组合在精密测量中的应用

ADS131M02与PIC18F87J10组合在精密测量中的应用

1. 为什么选择ADS131M02与PIC18F87J10组合在工业测量和精密仪器领域,ADC(模数转换器)的性能往往决定整个系统的精度上限。ADS131M02是TI推出的24位Δ-Σ ADC,具有以下核心优势:双通道同步采样(最高64kSPS&a…

2026/7/11 3:05:47 阅读更多 →
Python调用OpenAI API的生产级实践:Requests+Pydantic重构方案

Python调用OpenAI API的生产级实践:Requests+Pydantic重构方案

1. 这不是“调用API”那么简单:为什么90%的Python开发者第一次用OpenAI接口就卡在环境配置和错误处理上“如何在Python中进行openAI接口调用”——这个标题看起来像一句再普通不过的技术提问,但背后藏着一个被严重低估的现实:它根本不是一道“…

2026/7/11 3:03:46 阅读更多 →
Elasticsearch 8.x 向量搜索实战:Python 客户端 5 步集成 Jina Embeddings

Elasticsearch 8.x 向量搜索实战:Python 客户端 5 步集成 Jina Embeddings

Elasticsearch 8.x 向量搜索实战:Python 客户端 5 步集成 Jina Embeddings在当今数据驱动的世界中,搜索技术正经历着从关键词匹配到语义理解的革命性转变。Elasticsearch 8.x 作为领先的分布式搜索和分析引擎,通过原生支持向量搜索功能&#…

2026/7/11 3:03:46 阅读更多 →
RVC、GPT-SoVITS、SVC 3款AI音色克隆方案对比:数据需求、音质与推理速度实测

RVC、GPT-SoVITS、SVC 3款AI音色克隆方案对比:数据需求、音质与推理速度实测

RVC、GPT-SoVITS、SVC:三款AI音色克隆技术深度横评与场景选型指南当游戏角色需要即兴配音时,当直播需要实时变声时,当内容创作者希望保留独特声线时——AI音色克隆技术正在重塑声音创作的边界。本文将深入解析当前最主流的三种解决方案&#…

2026/7/11 3:01:45 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻