PHP如何解决500M大文件的断点续传问题?
老哥的大文件上传历险记各位同行兄弟好啊我是辽宁的一名资深(其实就是年纪大了) Java 程序员最近接了个外包项目要求可真是把我这老腰给闪了需求分析这活儿比东北虎还猛客户要的文件上传功能那叫一个全面啊20G大文件传输我硬盘才500G啊文件夹上传保留层级1000个分类这是要上天啊加密传输存储SM4、AES全要断点续传关浏览器、重启电脑都不能丢进度兼容IE9这年头还有人用IE9预算100元以内我早餐都不止这个价啊技术选型老哥我太难了前端要用原生JS实现不能用现成框架。后端是SpringBootVue3这组合倒是挺时髦。但是要兼容IE9这不是让我用5G网络给大哥大打电话吗部分代码实现能跑就行前端部分 (原生JS)// 文件上传核心逻辑 - 兼容IE9的魔改版functionuploadFile(file,relativePath){returnnewPromise((resolve,reject){// 为IE9准备的XHR对象constxhrwindow.XMLHttpRequest?newXMLHttpRequest():newActiveXObject(Microsoft.XMLHTTP);// 分片上传逻辑constchunkSize5*1024*1024;// 5MBletoffset0;// 读取文件分片constreadChunk(){constchunkfile.slice(offset,offsetchunkSize);// 加密分片 (伪代码)constencryptedChunkencryptChunk(chunk,SM4);constformDatanewFormData();formData.append(file,encryptedChunk);formData.append(fileName,file.name);formData.append(relativePath,relativePath);formData.append(totalSize,file.size);formData.append(chunkSize,chunkSize);formData.append(offset,offset);xhr.open(POST,/api/upload,true);xhr.setRequestHeader(X-Requested-With,XMLHttpRequest);xhr.onloadfunction(){if(xhr.status200){offsetchunkSize;if(offsetfile.size){readChunk();// 继续上传下一分片}else{resolve();// 上传完成}}else{reject(newError(上传失败));}};xhr.send(formData);};readChunk();});}// 文件夹上传 - 递归处理functionuploadFolder(entries,relativePath){returnPromise.all(Array.from(entries).map(entry{returnnewPromise((resolve){if(entry.isFile){entry.file(file{uploadFile(file,relativePath).then(resolve);});}elseif(entry.isDirectory){constdirReaderentry.createReader();dirReader.readEntries(entries{uploadFolder(entries,${relativePath}/${entry.name}).then(resolve);});}});}));}后端部分 (SpringBoot)RestControllerRequestMapping(/api)publicclassFileUploadController{PostMapping(/upload)publicResponseEntityuploadFile(RequestParam(file)MultipartFilefile,RequestParam(fileName)StringfileName,RequestParam(valuerelativePath,defaultValue)StringrelativePath,RequestParam(totalSize)longtotalSize,RequestParam(chunkSize)intchunkSize,RequestParam(offset)longoffset){try{// 解密文件分片 (伪代码)byte[]decryptedDatadecryptChunk(file.getBytes(),SM4);// 构建目标路径保留文件夹结构PathtargetPathPaths.get(uploads,relativePath,fileName);Files.createDirectories(targetPath.getParent());// 断点续传处理if(offset0){Files.write(targetPath,decryptedData);}else{Files.write(targetPath,decryptedData,StandardOpenOption.APPEND);}// 检查是否上传完成longuploadedSizeoffsetchunkSize;if(uploadedSizetotalSize){// 文件上传完成后的处理returnResponseEntity.ok().body(上传完成);}else{returnResponseEntity.ok().body(分片上传成功);}}catch(Exceptione){returnResponseEntity.status(500).body(上传失败: e.getMessage());}}// 文件夹下载接口GetMapping(/downloadFolder)publicvoiddownloadFolder(RequestParamStringfolderPath,HttpServletResponseresponse)throwsIOException{PathsourcePathPaths.get(uploads,folderPath);if(!Files.exists(sourcePath)){response.sendError(404,文件夹不存在);return;}response.setContentType(application/octet-stream);response.setHeader(Content-Disposition,attachment; filename\URLEncoder.encode(sourcePath.getFileName().toString(),UTF-8)\);// 非打包下载逐个文件传输try(OutputStreamoutresponse.getOutputStream()){Files.walk(sourcePath).filter(Files::isRegularFile).forEach(file-{try{// 保留相对路径StringrelativePathsourcePath.relativize(file).toString();// 写入文件信息头out.write((FILE:relativePath:Files.size(file)\n).getBytes());// 写入文件内容Files.copy(file,out);out.write(\n\n.getBytes());// 文件分隔符}catch(IOExceptione){thrownewUncheckedIOException(e);}});}}}老哥的心里话兄弟们啊100块钱预算要搞这么复杂的系统这不是难为我这资深程序员吗还要7×24小时技术支持这得加多少个鸡腿啊不过话说回来咱们程序员不就是喜欢挑战吗虽然这需求比东北的冬天还冷但谁让咱们是代码界的抗寒战士呢友情提示完整实现这个系统需要解决很多细节问题比如大文件分片上传的稳定性IE9兼容性的各种坑文件夹层级结构的准确保持加密性能优化断点续传的状态管理如果真要做成产品级质量建议增加预算至少加两个零考虑使用成熟的文件存储服务放弃IE9支持真心的欢迎加入我们的QQ群(374992201)一起讨论虽然红包可能没有99元那么大但技术交流绝对真诚安装环境PHP:7.2.14调整块大小NOSQLNOSQL不需要任何配置可以直接访问测试SQL创建数据库您可以直接复制脚本进行创建配置数据库连接安装依赖访问页面进行测试数据表中的数据效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。免费下载示例点击下载完整示例

相关新闻

AI发布任务的时代

AI发布任务的时代

这是一个非常深刻且颇具前瞻性的视角,你描述的“AI发布任务,人类接单的时代”正在从科幻构想快速走向现实。这不仅仅是一种工作模式的改变,更可能是社会生产关系的深刻重构。我们可以从几个层面来探讨这个时代:1. 核心驱动力&…

2026/7/6 14:14:09 阅读更多 →
给你一张清单 10个降AI率网站测评对比 自考必看!

给你一张清单 10个降AI率网站测评对比 自考必看!

在自考论文写作过程中,越来越多的学生开始关注“AI生成内容检测率”(AIGC率)的问题。随着各大高校对AI痕迹的审查越来越严格,如何有效降低论文中的AI痕迹、提升原创性成为每位考生必须面对的挑战。而AI降重工具的出现,…

2026/5/17 3:11:22 阅读更多 →
2.2 安全防护体系:如何防止API被恶意调用和刷量?

2.2 安全防护体系:如何防止API被恶意调用和刷量?

2.2 安全防护体系:如何防止API被恶意调用和刷量? 引言 在构建面向多业务方的平台服务时,安全防护是不可忽视的重要环节。恶意调用、刷量攻击、数据泄露等问题不仅会影响平台的稳定运行,还可能导致严重的业务损失和声誉损害。特别是在通知平台这类高频调用的服务中,如何有…

2026/7/6 6:36:17 阅读更多 →

最新新闻

AI进入下半场:模型不再稀缺,真正稀缺的是算力、场景和信任

AI进入下半场:模型不再稀缺,真正稀缺的是算力、场景和信任

过去一年,AI行业最显著的变化,是判断AI进展的方式变了。过去一年,AI行业最显著的变化,是判断AI进展的方式变了。 在更长一段时间里,外界习惯用参数规模、榜单排名、融资金额和产品发布节奏来理解AI。但进入2025年后&a…

2026/7/6 14:13:10 阅读更多 →
踩坑半年总结:C#部署YOLO最容易忽略的8个工业级细节

踩坑半年总结:C#部署YOLO最容易忽略的8个工业级细节

前言 网上关于C#部署YOLO的教程铺天盖地,但90%都停留在“跑通Demo”的阶段。真正把模型塞进产线、扛住724小时运行、应对各种边缘Case后,你才会发现:能跑和能用之间,隔着一整条护城河。 本文不讲基础环境搭建,只聊我在过去半年工业落地中用血泪换来的8个细节。每一个都是深…

2026/7/6 14:11:07 阅读更多 →
【VTG】T2SGrid: Temporal-to-Spatial Gridification for VTG

【VTG】T2SGrid: Temporal-to-Spatial Gridification for VTG

note T2SGrid 的最大贡献在于范式创新:它没有直接设计复杂的时间模块,而是巧妙地借用了视觉大模型原生的空间注意力机制,将时间流转化为空间网格。把视频多帧拼成一张网格图(把视频 clip 拼成网格图),让普…

2026/7/6 14:11:07 阅读更多 →
Auto memory,把 Claude Code 从临时搭档变成项目老同事

Auto memory,把 Claude Code 从临时搭档变成项目老同事

最近在研究 Claude Code 的记忆机制时,我一直觉得 Auto memory 这个功能被低估了。很多人把 Claude Code 当成一个会写代码、能跑命令、能改文件的终端助手,但真正把它和普通聊天式编程助手拉开距离的地方,不只是它能操作代码仓库,而是它可以在一次次会话之间沉淀项目经验。…

2026/7/6 14:09:05 阅读更多 →
多设备传动改造:盖茨工业皮带的工程应用经验复盘

多设备传动改造:盖茨工业皮带的工程应用经验复盘

摘要工厂多类型设备同步开展传动系统技改时,普遍存在工况混杂、传动结构差异化大、原有传动故障根源复杂、改造标准不统一等工程难题。大量现场技改数据统计,85% 以上改造后皮带仍短期失效,并非配件本体性能不足,而是前期故障诊断…

2026/7/6 14:09:05 阅读更多 →
CP-ABE代理重加密与混合检测技术构建动态数据安全闭环

CP-ABE代理重加密与混合检测技术构建动态数据安全闭环

1. 项目概述:当数据安全遇上智能防御 最近在梳理一些前沿的数据安全与网络防御方案时,一个组合技术方案引起了我的注意,那就是“密文策略属性基代理重加密”与“应用层攻击混合检测技术”的结合。这听起来像是一串复杂的技术名词堆砌&#xf…

2026/7/6 14:07:03 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

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/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

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

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

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

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

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

2026/7/6 6:52:56 阅读更多 →

月新闻