基于工作流引擎的AI短剧生成系统设计:6步链路拆解与实现思路
2026/7/15 3:47:24
开发者日记 - 大文件传输系统开发实录
日期:2023年11月15日
天气:阴
作为江苏的一名独立开发者,近期承接了一个企业级文件传输系统项目,核心需求如下:
webkitdirectory(非标准)。localStorage或IndexedDB存储临时进度(跨会话)。directory事件,递归解析文件夹结构,生成扁平化的文件路径列表(如/parent/child/file.txt)。putObject设置Content-Type: application/directory)。// src/components/Uploader.vueimportWebUploaderfrom'webuploader';import'webuploader/dist/webuploader.css';exportdefault{mounted(){constuploader=WebUploader.create({swf:'/path/to/webuploader.swf',// IE8/9兼容server:'/api/upload',chunked:true,chunkSize:5*1024*1024,// 5MB分片formData:{fileMd5:'',// 通过后端接口预先计算isDir:false// 标记是否为文件夹},files:[]// 存储文件夹结构});// 监听文件夹选择(仅现代浏览器)document.getElementById('filePicker').addEventListener('change',(e)=>{constfiles=e.target.files;if(files.length&&files[0].webkitRelativePath){// 递归解析文件夹constparseDir=(file,path='')=>{constfullPath=path+file.name;if(file.isDirectory){// 模拟文件夹上传(实际需后端支持)return;}uploader.addFiles({name:file.name,relativePath:fullPath,size:file.size,type:file.type});};Array.from(files).forEach(file=>parseDir(file));}});// 断点续传:从localStorage加载进度constresumeData=localStorage.getItem('upload_progress');if(resumeData){const{fileMd5,chunks}=JSON.parse(resumeData);uploader.option('formData',{fileMd5,isDir:false});// 跳过已上传的分片(需后端配合校验)}// 上传完成合并分片uploader.on('uploadSuccess',(file,response)=>{if(response.needMerge){fetch('/api/merge',{method:'POST',body:JSON.stringify({fileMd5:response.fileMd5})});}});}};// api/upload.phpprepare("INSERT INTO upload_chunks (file_md5, chunk_index, uploaded_at) VALUES (?, ?, NOW()) ON DUPLICATE KEY UPDATE updated_at = NOW()");$stmt->execute([$fileMd5,$chunkIndex]);// 上传分片到华为云OBS$obsClient=new\OBS\ObsClient(['key'=>'your-access-key','secret'=>'your-secret-key','endpoint'=>'obs.cn-east-3.myhuaweicloud.com']);$obsPath="uploads/{$fileMd5}/chunk_{$chunkIndex}";$obsClient->putObject(['Bucket'=>'your-bucket','Key'=>$obsPath,'SourceFile'=>$_FILES['file']['tmp_name']]);// 检查是否所有分片已上传$chunksCount=$pdo->query("SELECT COUNT(*) FROM upload_chunks WHERE file_md5 = '{$fileMd5}'")->fetchColumn();$totalChunks=$_POST['totalChunks'];// 前端传递总分片数if($chunksCount===$totalChunks){echojson_encode(['needMerge'=>true,'fileMd5'=>$fileMd5]);}else{echojson_encode(['success'=>true]);}?>CREATETABLEupload_chunks(idINTAUTO_INCREMENTPRIMARYKEY,file_md5VARCHAR(32)NOTNULL,chunk_indexINTNOTNULL,uploaded_atDATETIMEDEFAULTCURRENT_TIMESTAMP,UNIQUEKEY(file_md5,chunk_index));es5-shim和json2.js。webkitRelativePath,IE使用ActiveX模拟(需用户授权)。今日总结:核心功能已跑通,但IE兼容性和文件夹解析仍需打磨。欢迎大神加入QQ群交流优化方案!
(日记结束)
注:实际项目中需补充安全校验(如文件类型白名单、分片签名防篡改),代码仅为示例框架,需根据业务需求调整。
PHP:7.2.14
NOSQL不需要任何配置,可以直接访问测试
您可以直接复制脚本进行创建
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
点击下载完整示例