news 2026/4/16 15:04:55

PHP如何解决500M大文件的断点续传问题?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP如何解决500M大文件的断点续传问题?

老哥的大文件上传历险记

各位同行兄弟好啊!我是辽宁的一名"资深"(其实就是年纪大了) Java 程序员,最近接了个外包项目,要求可真是把我这老腰给闪了!

需求分析:这活儿比东北虎还猛

客户要的文件上传功能,那叫一个全面啊:

  • 20G大文件传输(我硬盘才500G啊)
  • 文件夹上传保留层级(1000个分类?这是要上天啊)
  • 加密传输存储(SM4、AES全要)
  • 断点续传(关浏览器、重启电脑都不能丢进度)
  • 兼容IE9(这年头还有人用IE9?)
  • 预算100元以内(我早餐都不止这个价啊!)

技术选型:老哥我太难了

前端要用原生JS实现,不能用现成框架。后端是SpringBoot+Vue3,这组合倒是挺时髦。但是!要兼容IE9?这不是让我用5G网络给大哥大打电话吗?

部分代码实现:能跑就行

前端部分 (原生JS)

// 文件上传核心逻辑 - 兼容IE9的魔改版functionuploadFile(file,relativePath=''){returnnewPromise((resolve,reject)=>{// 为IE9准备的XHR对象constxhr=window.XMLHttpRequest?newXMLHttpRequest():newActiveXObject("Microsoft.XMLHTTP");// 分片上传逻辑constchunkSize=5*1024*1024;// 5MBletoffset=0;// 读取文件分片constreadChunk=()=>{constchunk=file.slice(offset,offset+chunkSize);// 加密分片 (伪代码)constencryptedChunk=encryptChunk(chunk,'SM4');constformData=newFormData();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.onload=function(){if(xhr.status===200){offset+=chunkSize;if(offset<file.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){constdirReader=entry.createReader();dirReader.readEntries(entries=>{uploadFolder(entries,`${relativePath}/${entry.name}`).then(resolve);});}});}));}

后端部分 (SpringBoot)

@RestController@RequestMapping("/api")publicclassFileUploadController{@PostMapping("/upload")publicResponseEntityuploadFile(@RequestParam("file")MultipartFilefile,@RequestParam("fileName")StringfileName,@RequestParam(value="relativePath",defaultValue="")StringrelativePath,@RequestParam("totalSize")longtotalSize,@RequestParam("chunkSize")intchunkSize,@RequestParam("offset")longoffset){try{// 解密文件分片 (伪代码)byte[]decryptedData=decryptChunk(file.getBytes(),"SM4");// 构建目标路径,保留文件夹结构PathtargetPath=Paths.get("uploads",relativePath,fileName);Files.createDirectories(targetPath.getParent());// 断点续传处理if(offset==0){Files.write(targetPath,decryptedData);}else{Files.write(targetPath,decryptedData,StandardOpenOption.APPEND);}// 检查是否上传完成longuploadedSize=offset+chunkSize;if(uploadedSize>=totalSize){// 文件上传完成后的处理returnResponseEntity.ok().body("上传完成");}else{returnResponseEntity.ok().body("分片上传成功");}}catch(Exceptione){returnResponseEntity.status(500).body("上传失败: "+e.getMessage());}}// 文件夹下载接口@GetMapping("/downloadFolder")publicvoiddownloadFolder(@RequestParamStringfolderPath,HttpServletResponseresponse)throwsIOException{PathsourcePath=Paths.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(OutputStreamout=response.getOutputStream()){Files.walk(sourcePath).filter(Files::isRegularFile).forEach(file->{try{// 保留相对路径StringrelativePath=sourcePath.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小时技术支持,这得加多少个鸡腿啊!

不过话说回来,咱们程序员不就是喜欢挑战吗?虽然这需求比东北的冬天还冷,但谁让咱们是"代码界的抗寒战士"呢!

友情提示:完整实现这个系统需要解决很多细节问题,比如:

  1. 大文件分片上传的稳定性
  2. IE9兼容性的各种坑
  3. 文件夹层级结构的准确保持
  4. 加密性能优化
  5. 断点续传的状态管理

如果真要做成产品级质量,建议:

  1. 增加预算(至少加两个零)
  2. 考虑使用成熟的文件存储服务
  3. 放弃IE9支持(真心的!)

欢迎加入我们的QQ群(374992201)一起讨论,虽然红包可能没有99元那么大,但技术交流绝对真诚!

安装环境

PHP:7.2.14

调整块大小

NOSQL

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

SQL

创建数据库

您可以直接复制脚本进行创建

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

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

AI发布任务的时代

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

作者头像 李华
网站建设 2026/4/16 11:03:16

AI写论文宝藏推荐!这4款AI论文写作工具,提升论文写作效率!

你是否在为写期刊论文、毕业论文或职称论文而感到苦恼&#xff1f;当我们面对浩瀚如海的文献资料时&#xff0c;常常无从下手&#xff0c;而繁杂的格式要求则让人感到焦虑。反复修改的过程又耗费了大量精力&#xff0c;使得写作效率低下&#xff0c;这对许多学术工作者来说真是…

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

AI写论文有妙招!推荐4款AI论文生成工具,助你快速完成论文

在学术论文写作中的困境与AI工具的解决方案 在撰写学术论文的过程中&#xff0c;像期刊论文、毕业论文或职称论文这样的任务&#xff0c;往往让研究者感到无比棘手。面对海量的文献资料&#xff0c;查找相关信息就像是在大海捞针一样困难。同时&#xff0c;各种复杂的格式要求…

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

开题卡住了?AI论文工具 千笔 VS 灵感ai,专科生专属神器!

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具逐渐成为高校学生完成毕业论文的重要助手。无论是开题报告还是论文撰写&#xff0c;越来越多的学生开始借助AI工具提升效率、降低难度。然而&#xff0c;面对市场上功能各异、品质参差不齐的AI写作工具&#xff0c;许多学…

作者头像 李华
网站建设 2026/4/15 15:41:38

“自动驾驶控制器:毫米波雷达到车体坐标系标定工程——偏航角Yaw的标定与学习指南”

自动驾驶控制器&#xff0c;自动驾驶多传感器联合标定系列之毫米波雷达到车体坐标系的标定工程 &#xff0c; 本商品对毫米波雷达的偏航角yaw进行标定,分为粗略标定、静态目标识别和曲线拟合三个步骤。这个工程带有代码注释&#xff0c;帮助您对标定算法的的理解和学习。 实实在…

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

2025年OE SCI2区TOP,面向复杂三维海上风电海域救援的多无人机协同路径规划,深度解析+性能实测

目录1.摘要2.环境模型3.海洋多无人机路径规划4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 随着海洋经济的发展&#xff0c;海上救援任务日益频繁&#xff0c;多无人机协同搜索与救援为海上救援提供了新的技术途径。针对复杂三维海上风场环境下的多无人机…

作者头像 李华