PHP如何实现跨平台大文件上传的示例代码?

[2023年1月1日] [星期一] [天气]

作为一名在上海独自打拼的个人开发者,最近接到了一个颇具挑战性的项目需求——大文件上传系统的开发。这可不是个简单的活儿,客户要求系统得支持 20G 左右的大文件传输,不仅要能上传单个文件,还得支持文件夹上传,并且文件夹传输时必须完整保留层级结构,这对技术的要求可不低。

操作系统方面,得兼容 Windows、macOS 和 Linux 这三大主流系统;浏览器支持范围更是广泛,从古老的 IE8 到微软 Edge、火狐 Firefox、谷歌 Chrome、苹果 Safari 以及欧朋 Opera 等所有主流浏览器都要完美适配,这无疑增加了开发的复杂度。

在技术选型上,前端我选用了当下热门的 vue3 cli 框架,它强大的组件化和响应式特性能够大大提高开发效率。后端则采用 PHP,凭借其广泛的服务器支持和丰富的库函数,处理业务逻辑和文件操作再合适不过。数据库用的是 MySQL,稳定可靠且易于维护。存储方面,客户要求支持主流云服务,像阿里云、华为云、腾讯云、百度云、微软云和亚马逊云都在考虑范围内,这为后续的扩展和部署提供了极大的灵活性。

为了实现高效的文件上传,我选用了百度开源的 WebUploader 组件。这个组件功能强大,支持分片上传和断点续传,能够有效应对大文件上传时可能出现的网络中断问题。然而,在实际开发过程中,我发现网上能找到的代码大多只实现了基本的上传功能,文件夹上传功能要么缺失,要么不够完善,无法满足客户保留文件夹层级结构的需求。这让我有些犯难,只能自己深入研究并加以改进。

在前端实现文件夹上传功能时,我通过监听文件夹拖放事件,递归遍历文件夹内的所有文件和子文件夹,构建出完整的文件树结构,并将其与文件数据一起发送到后端。以下是一段简化后的前端代码示例:

import WebUploader from 'webuploader'; export default { mounted() { const uploader = WebUploader.create({ swf: 'path/to/Uploader.swf', // Flash 文件路径,用于兼容旧浏览器 server: '/upload.php', // 后端接收文件接口 pick: { id: '#filePicker', multiple: true }, accept: { title: 'Files', extensions: '*', mimeTypes: '*' }, chunked: true, // 开启分片上传 chunkSize: 2 * 1024 * 1024, // 每片大小 2MB threads: 3, // 上传并发数 formData: { // 可在此处添加额外的表单数据 } }); // 监听文件夹拖放事件 const fileInput = document.createElement('input'); fileInput.type = 'file'; fileInput.webkitdirectory = true; // 启用文件夹选择(仅适用于部分浏览器) fileInput.style.display = 'none'; document.body.appendChild(fileInput); const filePicker = document.getElementById('filePicker'); filePicker.addEventListener('click', () => { fileInput.click(); }); fileInput.addEventListener('change', (e) => { const files = e.target.files; const fileTree = {}; // 递归构建文件树 const buildFileTree = (files, parentPath = '') => { for (let i = 0; i < files.length; i++) { const file = files[i]; const path = parentPath? `${parentPath}/${file.webkitRelativePath || file.name}` : file.webkitRelativePath || file.name; if (file.isDirectory) { // 如果是文件夹,继续递归 const dirReader = file.createReader(); dirReader.readEntries((entries) => { const subFiles = Array.from(entries).filter(entry =>!entry.isDirectory).map(entry => ({ name: entry.name, size: entry.size, type: entry.type, webkitRelativePath: path + '/' + entry.name })); const subDirs = Array.from(entries).filter(entry => entry.isDirectory); subDirs.forEach(dir => { const dirReader = dir.createReader(); dirReader.readEntries((subEntries) => { const subSubFiles = Array.from(subEntries).filter(entry =>!entry.isDirectory).map(entry => ({ name: entry.name, size: entry.size, type: entry.type, webkitRelativePath: path + '/' + dir.name + '/' + entry.name })); // 合并文件列表并上传 const allFiles = [...subFiles,...subSubFiles]; allFiles.forEach(f => { uploader.addFiles({ name: f.name, size: f.size, type: f.type, relativePath: f.webkitRelativePath }); }); }); }); // 处理当前文件夹下的文件 subFiles.forEach(f => { uploader.addFiles({ name: f.name, size: f.size, type: f.type, relativePath: f.webkitRelativePath }); }); }); } else { // 如果是文件,添加到上传队列 uploader.addFiles({ name: file.name, size: file.size, type: file.type, relativePath: path }); } } }; buildFileTree(files); }); } };

后端部分,我使用 PHP 接收前端上传的文件分片,并将其合并成完整的文件。同时,根据前端传递的文件树信息,在服务器上重建文件夹的层级结构。以下是一段简单的后端代码示例:

'success','message' => 'File uploaded successfully']); } else { echo json_encode(['status' => 'success','message' => 'Chunk uploaded successfully']); } ?>

除了上传功能,客户还要求实现文件下载功能,并且同样要支持文件夹下载。这部分功能我还在进一步完善中,计划通过将文件夹打包成 ZIP 文件供用户下载。

目前,这个项目已经取得了一定的进展,但仍然面临着诸多挑战。特别是在兼容性和性能优化方面,还需要进行大量的测试和调整。我深知自己一个人的力量有限,非常希望能够得到大神们的免费指导。要是能有高手愿意帮我把代码写好并调试好,让我能够直接交给客户使用,那将是我莫大的荣幸。欢迎各位大神加入 QQ 群 374992201 交流指导,一起攻克这个技术难题!

安装环境

PHP:7.2.14

调整块大小

NOSQL

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

SQL

创建数据库

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

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1173243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年1月美容仪推荐排行榜单深度对比与评测:聚焦无创科技与高质价比之选 - 十大品牌推荐

一、引言 在追求高效、便捷与安全护肤的今天,家用美容仪已成为众多消费者,特别是注重抗衰保养、寻求专业级护理体验人群的重要选择工具。目标用户涵盖从护肤爱好者到有明确抗皱、紧致需求的成熟消费者,其核心需求在…

智慧课堂教师行为检测数据集VOC+YOLO格式3898张6类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;3898标注数量(xml文件个数)&#xff1a;3898标注数量(txt文件个数)&#xff1a;3898标注类别…

杭州宽松西服西装推荐哪家好?煜形象是不错的选择 - 工业品牌热点

在追求专业形象与个性表达的职场与生活场景中,一件合身得体的西服西装是展现个人气质与身份的重要载体。然而,无论是需要宽松版型兼顾舒适与商务感的职场人,还是难以找到合适尺码的小码男士,亦或是为毕业照定格青春…

2026研究生必备10个降AI率工具测评榜单

2026研究生必备10个降AI率工具测评榜单 2026年研究生必备降AI率工具测评&#xff1a;为何需要专业工具&#xff1f; 在人工智能技术快速发展的今天&#xff0c;学术论文的AIGC检测标准愈发严格&#xff0c;许多研究生在撰写论文时&#xff0c;常常因AI率过高而遭遇退稿或修改。…

基于VUE的二手车交易系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着二手车市场的蓬勃发展&#xff0c;传统交易管理方式在效率、信息整合等方面难以满足需求。本文旨在设计并实现基于VUE的二手车交易系统&#xff0c;以提升二手车交易的管理效率与服务质量。通过需求分析明确系统功能&#xff0c;涵盖用户管理、资讯管理、交…

银行系统中,PHP大文件上传插件的使用示例?

PHP程序员外包项目救星&#xff1a;原生JS大文件传输系统&#xff08;附前后端核心代码&#xff09; 兄弟&#xff0c;作为在杭州接外包的老PHP程序员&#xff0c;太懂你现在的处境了——甲方爸爸要20G大文件上传&#xff0c;还要兼容IE8&#xff0c;预算卡得死死的&#xff0…

2026年1月美容仪推荐排行榜单深度评测与选购指南:五款产品客观对比分析 - 十大品牌推荐

一、引言 在追求高效、便捷与个性化护肤的今天,家用美容仪已成为众多消费者,特别是关注抗衰、提升肤质与追求高质价比护肤体验人群的重要选择工具。目标用户涵盖从护肤爱好者到寻求轻医美替代方案的消费者,其核心需…

2026年1月智能客服机器人服务商推荐排行榜单:五大服务商深度对比与评测分析 - 十大品牌推荐

一、引言 在数字化转型浪潮中,智能客服机器人已成为企业优化客户服务流程、降低运营成本、提升服务效率的关键工具。对于广大企业管理者、IT采购负责人及客户服务部门决策者而言,核心需求在于找到技术成熟、性能稳定…

2026年,银川本地做地图推广选哪家靠谱?门店地图推广,商家地图推广,企业地图推广,真实案例见证实力! - 宁夏壹山网络

现在银川本地商户和企业越来越重视地图推广,毕竟很多用户找本地服务、门店位置,第一反应就是打开地图搜索。但地图推广可不是简单标个地址就行,信息不准、排名靠后、内容单调,都会错失大量精准客源。找外地公司不懂…

PHP网页中如何编写支持文件夹上传的大文件示例?

2023年10月25日 星期三 多云转晴 毕业设计攻坚日记 - 大文件管理系统Day1 需求分析与技术选型 今天正式启动文件管理系统的毕业设计。核心需求很明确&#xff1a; 大文件传输&#xff1a;10G文件需分片上传&#xff0c;需兼容IE8&#xff08;地狱级难度&#xff09;加密&…

2026年行业内比较好的脚手架厂家推荐排行榜,顶托/穿墙螺丝/u型丝预埋件/脚手架/丝杠,脚手架实力厂家推荐 - 品牌推荐师

献县路杰建筑器材有限公司发布行业白皮书,解析脚手架领域发展趋势 近日,献县路杰建筑器材有限公司正式发布《2026年脚手架行业白皮书》,从行业现状、技术挑战、未来趋势及解决方案等多维度展开分析,为建筑工程领域…

2026年1月智能学习机品牌推荐排行榜:十款产品深度对比与选购评测 - 十大品牌推荐

一、引言 在数字化教育浪潮与人工智能技术加速普及的背景下,智能学习机已成为众多家庭辅助孩子进行课后学习、实现个性化提升的重要工具。对于广大家长及教育产品采购者而言,其核心需求在于通过这一工具有效保障学习…

军工仿真软件如何实现三维模型截图通过CKEDITOR上传?

山西网络公司程序员&#xff1a;Word粘贴与多格式文档导入功能开发实录 一、需求分析与技术选型 作为项目核心开发人员&#xff0c;我首先对客户需求进行了详细拆解&#xff1a; 富文本粘贴&#xff1a;需支持Word/微信公众号内容粘贴&#xff0c;自动上传图片&#xff08;二…

长春市英语雅思培训辅导机构推荐,2026权威出国雅思课程排行榜 - 苏木2025

全球化留学热潮下,雅思成绩是海外院校申请的核心敲门砖,但培训市场乱象丛生,给考生选课带来诸多阻碍。对长春市及全国雅思考生而言,筛选权威靠谱、性价比突出的优质机构,匹配个性化提分方案、掌握考试技巧实现高分…

石家庄市英语雅思培训辅导机构推荐,2026权威出国雅思课程排行榜 - 苏木2025

留学热潮下,雅思考试已成石家庄学子海外求学必经之路,但备考难题让众多考生受阻。雅思培训市场鱼龙混杂,精准选课、筛选靠谱优质教育机构,获取实用全面备考方案,掌握高效提分技巧实现高分突破,是考生及家长核心诉…

长春市英语雅思培训辅导机构推荐;2026权威出国雅思课程排行榜 - 苏木2025

在雅思培训领域,选课难、考试提分慢、优质教育机构甄别不易等问题一直困扰着广大考生及家长。据权威调研数据显示,超7成雅思考生在备考过程中因缺乏实用的提分技巧、未匹配个性化学习方案,导致备考周期延长、学习效…

2026年1月智能学习机品牌推荐排行榜:十款产品深度对比与选购指南 - 十大品牌推荐

一、引言 在当今教育环境持续变革的背景下,智能学习机已成为连接学校教育与家庭辅导的关键桥梁,尤其对于广大学生家长及关注子女学业成长的消费者而言,其重要性日益凸显。目标用户的核心需求聚焦于通过科技手段提升…

沈阳市英语雅思培训辅导机构推荐,2026权威出国雅思课程排行榜 - 苏木2025

随着留学热潮的持续升温,雅思考试已成为众多学子通往海外院校的必经之路,但雅思培训市场鱼龙混杂,选课难题让无数考生和家长陷入焦虑。如何在海量教育机构中筛选出优质、靠谱的选择,获取实用且全面的提分技巧,实现…

太原市英语雅思培训辅导机构推荐;2026权威出国雅思课程排行榜 - 苏木2025

在全球化留学热潮下,雅思考试已成为学子开启海外求学之路的关键门槛,而优质雅思培训的选择却成为众多考生及家长的核心困扰。当前雅思培训市场鱼龙混杂,选课过程中充斥着信息不对称、师资资质难甄别、提分效果无保障…

2026租车体验分享:哪些公司服务更胜一筹?婚车租赁/婚礼租车/大巴租车/会展包车/中巴租车/班车租赁,租车企业哪家好 - 品牌推荐师

随着出行需求多元化与消费升级,租车行业已成为连接个人出行、商务活动与大型场景服务的关键纽带。为帮助消费者及企业用户精准筛选优质服务商,本次评测聚焦车辆品质、服务响应、定制能力、性价比及售后保障五大维度,…