集团网站建设详细策划世界著名网站开发语言

张小明 2026/3/2 23:05:03
集团网站建设详细策划,世界著名网站开发语言,腾讯企业邮箱登录入口网页版入口,网络科技官网网站建设大文件上传方案探索#xff1a;从WebUploader到自定义分片上传的实践 作为一名前端开发工程师#xff0c;最近遇到了一个颇具挑战性的需求#xff1a;需要在Vue项目中实现4GB左右大文件的稳定上传#xff0c;且要兼容Chrome、Firefox、Edge等主流浏览器#xff0c;后端使…大文件上传方案探索从WebUploader到自定义分片上传的实践作为一名前端开发工程师最近遇到了一个颇具挑战性的需求需要在Vue项目中实现4GB左右大文件的稳定上传且要兼容Chrome、Firefox、Edge等主流浏览器后端使用PHP接收。此前我们采用了百度开源的WebUploader组件但在实际使用中遇到了几个难以解决的问题分片上传过程中偶尔会出现断点续传失效的情况对新版浏览器的兼容性不够理想缺乏官方技术支持社区活跃度下降自定义UI的灵活性不足方案选型思考经过技术调研我评估了以下几个主流方案Plupload功能全面但文档不够友好对Vue集成支持一般Uppy现代感强但体积较大学习曲线较陡Resumable.js专注分片上传但UI较为基础自定义实现基于XMLHttpRequest/Fetch API实现核心分片逻辑最终决定采用自定义分片上传方案主要基于以下考虑完全控制上传流程可以针对业务需求深度优化减少第三方依赖降低维护成本与Vue生态无缝集成核心实现思路1. 前端分片策略// 文件分片工具函数constchunkFile(file,chunkSize5*1024*1024){constchunks[]letcurrent0while(currentfile.size){chunks.push({file:file.slice(current,currentchunkSize),chunkIndex:chunks.length,totalChunks:Math.ceil(file.size/chunkSize),fileName:file.name,fileSize:file.size,fileType:file.type,fileLastModified:file.lastModified,identifier:generateFileIdentifier(file)// 生成唯一标识用于断点续传})currentchunkSize}returnchunks}// 生成文件唯一标识基于文件内容constgenerateFileIdentifier(file){returnnewPromise((resolve){constreadernewFileReader()reader.onload(e){constarrnewUint8Array(e.target.result)consthashArrayArray.from(arr).map(bb.toString(16).padStart(2,0))resolve(hashArray.join().substring(0,16))}reader.readAsArrayBuffer(file.slice(0,1024*1024))// 取前1MB计算哈希})}2. Vue组件实现export default { data() { return { file: null, chunks: [], uploadStatus: idle, // idle, uploading, paused, completed, error progress: 0, error: null, currentChunk: 0, abortController: null } }, methods: { async handleFileChange(e) { this.file e.target.files[0] if (!this.file) return // 生成文件标识简化版实际项目应使用更可靠的算法 const identifier await this.generateSimpleIdentifier(this.file) // 检查服务器是否有未完成的上传记录 const res await this.checkUploadStatus(identifier) if (res.exists) { if (confirm(检测到未完成的上传是否继续)) { this.currentChunk res.uploadedChunks } else { // 清除服务器记录实际项目应实现 } } this.chunks this.chunkFile(this.file) this.progress Math.round((this.currentChunk / this.chunks.length) * 100) }, async startUpload() { if (!this.file) return this.uploadStatus uploading this.error null this.abortController new AbortController() try { for (let i this.currentChunk; i this.chunks.length; i) { if (this.uploadStatus ! uploading) break // 处理暂停情况 const chunk this.chunks[i] const formData new FormData() formData.append(file, chunk.file) formData.append(chunkIndex, chunk.chunkIndex) formData.append(totalChunks, chunk.totalChunks) formData.append(fileName, chunk.fileName) formData.append(fileSize, chunk.fileSize) formData.append(fileType, chunk.fileType) formData.append(identifier, chunk.identifier) await this.uploadChunk(formData) this.currentChunk i 1 this.progress Math.round(((i 1) / this.chunks.length) * 100) } if (this.uploadStatus uploading) { await this.mergeChunks(this.chunks[0].identifier, this.chunks[0].fileName) this.uploadStatus completed this.$emit(upload-complete) } } catch (err) { console.error(上传失败:, err) this.error err.message || 上传过程中出现错误 this.uploadStatus error } }, async uploadChunk(formData) { return fetch(/api/upload-chunk.php, { method: POST, body: formData, signal: this.abortController.signal }) }, async mergeChunks(identifier, fileName) { return fetch(/api/merge-chunks.php, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ identifier, fileName }) }) }, // 简化版标识生成实际项目应使用更可靠的算法 generateSimpleIdentifier(file) { return ${file.name}-${file.size}-${file.lastModified} }, async checkUploadStatus(identifier) { // 实际项目应实现与后端的交互 return { exists: false, uploadedChunks: 0 } }, pauseUpload() { if (this.uploadStatus uploading) { this.abortController.abort() this.uploadStatus paused } }, resumeUpload() { if (this.uploadStatus paused) { this.startUpload() } } } }3. PHP后端实现要点$chunkIndex,totalChunks$totalChunks,fileName$fileName,uploadedtime()]));echojson_encode([statussuccess]);}else{http_response_code(500);echojson_encode([statuserror,messageFailed to save chunk]);}// merge-chunks.php - 合并分片header(Content-Type: application/json);$uploadDir/path/to/upload/dir/;$tempDir$uploadDir.temp/;$datajson_decode(file_get_contents(php://input),true);$identifier$data[identifier]??;$fileName$data[fileName]??;// 检查标识符和文件名if(empty($identifier)||empty($fileName)){http_response_code(400);echojson_encode([statuserror,messageInvalid parameters]);exit;}// 检查上传状态文件$statusFile$tempDir.$identifier..upload;if(!file_exists($statusFile)){http_response_code(404);echojson_encode([statuserror,messageUpload not found]);exit;}$statusjson_decode(file_get_contents($statusFile),true);$totalChunks$status[totalChunks]??0;// 合并文件$finalPath$uploadDir.$fileName;if($fpfopen($finalPath,wb)){for($i0;$i$totalChunks;$i){$chunkPath$tempDir.$identifier._.$i;if(!file_exists($chunkPath)){fclose($fp);unlink($finalPath);// 删除已创建的部分文件http_response_code(400);echojson_encode([statuserror,messageMissing chunk .$i]);exit;}$contentfile_get_contents($chunkPath);fwrite($fp,$content);unlink($chunkPath);// 删除已合并的分片}fclose($fp);// 删除状态文件unlink($statusFile);echojson_encode([statussuccess,path$finalPath]);}else{http_response_code(500);echojson_encode([statuserror,messageFailed to create final file]);}?方案优势与改进点优势完全可控从分片策略到上传逻辑完全自主实现深度优化可以根据网络状况动态调整分片大小良好兼容基于标准Web API实现兼容所有现代浏览器断点续传通过文件标识实现可靠的断点续传进度可视化精确计算上传进度可改进方向并发上传当前实现是顺序上传可优化为并发上传提高速度文件校验增加MD5/SHA校验确保文件完整性更可靠的标识生成当前简化版标识可能存在冲突风险服务端清理实现自动清理未完成上传的临时文件拖拽上传增强用户体验支持拖放文件上传实施建议渐进式实现先实现基本分片上传再逐步添加断点续传、并发上传等功能充分测试在不同网络环境和浏览器下进行全面测试监控上报添加上传失败监控和错误上报机制性能优化根据实际测试结果调整分片大小和并发数通过这种自定义实现方式我们成功解决了WebUploader带来的各种问题同时获得了更好的性能和更灵活的控制能力。目前该方案已在我们项目中稳定运行数月处理了数百个4GB文件的上传未出现重大故障。将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。批量下载支持文件批量下载下载续传文件下载支持离线保存进度信息刷新页面关闭页面重启系统均不会丢失进度信息。文件夹下载支持下载文件夹并保留层级结构不打包不占用服务器资源。下载示例点击下载完整示例
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站优化的注意事项比较好的做简历的网站

Surfer全新版本正式发布--围绕最核心的两大诉求打造:工作更高效,成果更易懂。从省时工具到清晰呈现复杂数据的新方法,此次更新全程为您的工作流程保驾护航。Surfer产品经理Kari Dickenson表示:“最新版本的Surfer提供了一系列功能…

张小明 2026/1/22 14:23:09 网站建设

顶尖手机网站建设济南建设集团招聘信息网站

nanopb 在 LoRa 终端设备中的实战应用:如何用 14 字节传完一整包传感器数据? 你有没有遇到过这样的问题: 一个简单的温湿度上报,JSON 报文却要发 50 多字节? LoRa 最大帧长才 255 字节,还没加协议头就快…

张小明 2026/1/22 14:22:38 网站建设

建设的网站后台会自动退出是正常的韩国设计app网站有哪些

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个疫情数据监控大屏项目。功能要求:1.世界地图展示各国感染数据2.折线图显示趋势变化3.顶部重要指标看板4.支持时间范围筛选5.自适应多种屏幕尺寸。使用GoViewECh…

张小明 2026/1/22 14:22:07 网站建设

医院网站和公众号建设方案app开发公司部门

用Linly-Talker生成产品介绍视频,转化率提升显著 在电商页面上,一个30秒的讲解视频,可能比千字文案更能打动用户。而过去,制作这样的视频需要策划、拍摄、配音、剪辑一整套流程,成本高、周期长。如今,只需一…

张小明 2026/1/22 14:21:36 网站建设

容桂顺德网站建设用户体验网站

Linux常见问题解答 1. 什么是Linux? Linux是一个类UNIX操作系统,它提供真正的多任务处理和多用户支持,还具备虚拟内存支持、共享库、按需加载、TCP/IP网络和复杂的内存管理等功能。Linux最初是由Linus Torvalds作为一个学校项目编写的,全球的人们为其编写软件,Linux发行…

张小明 2026/1/22 14:21:05 网站建设

安徽省建设干部学校培训网站呼伦贝尔北京网站建设

数学分析中的函数、空间与紧致性相关知识探讨 1. 函数相关问题 在数学分析里,存在许多关于函数性质的问题值得深入研究。例如有这样一个函数: [ \varphi(x, [a, b]) = \begin{cases} 16(x - a)^2(x - b)^2(b - a)^{-3}, & \text{若 } a \leq x \leq b \ 0, & …

张小明 2026/1/22 14:20:34 网站建设