当前位置: 首页 > article >正文

jQuery如何扩展百度WebUploader组件支持教育行业PPT课件的跨平台分片上传?

前端老兵的20G文件夹上传血泪史附部分代码各位前端同仁们好我是老王一个在福建靠写代码混口饭吃的前端民工。最近接了个奇葩项目客户要求用原生JS实现20G文件夹上传下载还要兼容IE9这简直是要了我这把老骨头的命啊项目奇葩需求大赏20G文件传输客户说他们每天要传大量资料我第一反应是您这是要传整个互联网吗文件夹层级保留要求上传1000个分类的文件还要保持结构这比整理我家衣柜还难加密传输存储SM4AES双加密我怀疑客户在搞什么国家机密断点续传关闭浏览器、重启电脑都不能丢进度这比记住女朋友生日还难非打包下载几万个文件单独下载这是要测试我家网速吗100元预算是的你没看错100块连我喝咖啡的钱都不够免费3年维护客户说年轻人要讲武德我差点把键盘吃了文件夹上传技术实现部分代码经过我日夜奋战其实是熬夜掉头发终于搞定了文件夹上传的核心功能。以下是部分原生JS实现代码20G文件夹上传神器IE9兼容版 .upload-container { padding: 20px; font-family: Microsoft YaHei, sans-serif; } .progress-container { margin-top: 20px; border: 1px solid #ddd; padding: 10px; } .file-tree { margin-top: 20px; border: 1px solid #eee; padding: 10px; max-height: 300px; overflow-y: auto; } 文件夹上传系统IE9兼容版 选择文件夹 上传进度: 0% 文件夹结构: // 全局变量存储文件信息IE9兼容的存储方案 const fileStorage { files: [], currentChunk: 0, totalChunks: 0, uploadId: null, // 模拟本地存储IE9没有localStorage的完整实现 save: function(key, value) { try { if (window.localStorage) { localStorage.setItem(key, JSON.stringify(value)); } else { // IE9兼容方案 - 使用userData或cookie这里简化处理 document.cookie key encodeURIComponent(JSON.stringify(value)) ; path/; } } catch (e) { console.error(存储失败:, e); } }, load: function(key) { try { if (window.localStorage) { const value localStorage.getItem(key); return value ? JSON.parse(value) : null; } else { // IE9兼容方案 const name key ; const ca document.cookie.split(;); for(let i0; ica.length; i) { let c ca[i]; while (c.charAt(0) ) c c.substring(1); if (c.indexOf(name) 0) return JSON.parse(decodeURIComponent(c.substring(name.length, c.length))); } return null; } } catch (e) { console.error(读取失败:, e); return null; } } }; // 处理文件夹选择 document.getElementById(folderInput).addEventListener(change, function(e) { const files e.target.files; if (!files || files.length 0) return; // 构建文件树结构 const fileTree buildFileTree(files); document.getElementById(fileTree).innerHTML renderFileTree(fileTree, ); // 存储文件信息用于后续上传 fileStorage.files Array.from(files).map(file ({ name: file.webkitRelativePath || file.name, size: file.size, type: file.type, lastModified: file.lastModified, chunks: Math.ceil(file.size / (1024 * 1024)) // 每块1MB })); // 初始化上传状态 fileStorage.totalChunks fileStorage.files.reduce((sum, file) sum file.chunks, 0); fileStorage.currentChunk 0; fileStorage.uploadId Date.now() - Math.random().toString(36).substr(2); // 保存上传状态 fileStorage.save(uploadState_ fileStorage.uploadId, { files: fileStorage.files, currentChunk: 0, totalChunks: fileStorage.totalChunks }); }); // 构建文件树简化版 function buildFileTree(files) { const tree {}; Array.from(files).forEach(file { const pathParts (file.webkitRelativePath || file.name).split(/); let currentLevel tree; pathParts.forEach((part, index) { if (index pathParts.length - 1) { // 文件节点 currentLevel[part] { isFile: true, size: file.size, type: file.type }; } else { // 目录节点 if (!currentLevel[part]) { currentLevel[part] {}; } currentLevel currentLevel[part]; } } }); }); return tree; } // 渲染文件树简化版 function renderFileTree(tree, path) { let html ul; for (const key in tree) { const node tree[key]; const currentPath path ? path / key : key; if (node.isFile) { html li${key} (${formatFileSize(node.size)})/li; } else { html listrong${key}//strong; html renderFileTree(node, currentPath); html /li; } } html /ul; return html; } // 格式化文件大小 function formatFileSize(bytes) { if (bytes 0) return 0 Bytes; const k 1024; const sizes [Bytes, KB, MB, GB, TB]; const i Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) sizes[i]; } // 模拟上传过程实际项目中需要替换为真实的AJAX请求 function startUpload() { if (fileStorage.files.length 0) return; // 这里应该实现分块上传逻辑 // 由于篇幅限制只展示进度更新部分 const interval setInterval(() { fileStorage.currentChunk; const progress Math.min(100, Math.round((fileStorage.currentChunk / fileStorage.totalChunks) * 100)); document.getElementById(progressText).textContent progress %; document.getElementById(uploadProgress).value progress; // 保存进度 fileStorage.save(uploadProgress_ fileStorage.uploadId, { progress: progress, currentChunk: fileStorage.currentChunk, totalChunks: fileStorage.totalChunks }); if (progress 100) { clearInterval(interval); alert(上传完成(模拟)); } }, 500); // 模拟上传速度 } // 页面加载时检查是否有未完成的上传 window.onload function() { // 这里应该检查所有可能的uploadId并恢复上传 // 简化处理只检查一个示例 const savedState fileStorage.load(uploadProgress_example123); if (savedState savedState.progress 0 savedState.progress 100) { if (confirm(检测到未完成的上传是否继续)) { document.getElementById(progressText).textContent savedState.progress %; document.getElementById(uploadProgress).value savedState.progress; // 实际项目中需要恢复上传状态 } } };开发过程中的血泪教训IE9兼容性文件夹上传需要使用webkitdirectory属性但IE不支持最终解决方案告诉客户升级浏览器或使用Chrome框架大文件处理20G文件不能一次性读取到内存必须分块使用了File API的slice方法实现分块断点续传使用localStorage/cookie存储上传进度IE9兼容方案实际项目中应该使用IndexedDB或后端存储加密传输使用了crypto-js库实现AES加密但客户预算100元买不起库最终解决方案让后端同学实现加密文件夹结构保留使用webkitRelativePath获取文件相对路径构建树形结构存储文件夹层级真诚建议各位同行遇到这种项目请慎重考虑100元预算连买杯星巴克都不够免费维护3年不如直接让我给你打工20G文件传输在浏览器端实现这是要发明新的互联网协议吗加入我们的接单群虽然这个项目让我掉了一把头发但我还是决定继续在前端这条路上走下去。欢迎加入我们的接单群374992201群内福利加群送1-99元红包推荐项目拿20%提成超级会员享50%提成不定期分享技术资源和接单技巧最后说一句前端不易且行且珍惜。如果这个项目能做下来我考虑转行去卖生发液了…将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。下载示例点击下载完整示例

相关文章:

jQuery如何扩展百度WebUploader组件支持教育行业PPT课件的跨平台分片上传?

前端老兵的20G文件夹上传血泪史(附部分代码) 各位前端同仁们好,我是老王,一个在福建靠写代码混口饭吃的"前端民工"。最近接了个奇葩项目,客户要求用原生JS实现20G文件夹上传下载,还要兼容IE9&am…...

Android 15 深色模式:第三方应用强制适配深色模式的开关在哪里?

很多朋友在打开手机的深色模式(也叫暗黑模式)后,可能会发现一个问题:手机自己的界面和自带应用都变黑了,但很多常用的第三方软件,比如微信、淘宝或者一些银行APP,却还是亮晃晃的白色背景。这不仅…...

双向RRT算法的三维路径规划MATLAB代码:包含路径平滑处理

bi-rrt算法三维MATLAB代码 双向rrt算法的三维路径规划 加入路径的平滑处理直接打开MATLAB开整三维空间路径规划。双向RRT(Bi-RRT)这玩意儿比传统RRT快不是一点半点,核心思路就是两头长树往中间怼。咱们先看节点数据结构怎么设计: …...

“扫频法阻抗扫描验证及复现双馈风机MMC电压源型VSG阻抗建模与程序注释

扫频法 阻抗扫描 阻抗建模验证 正负序阻抗 逆变器 虚拟同步控制 VSG 复现 双馈风机MMC 电压源型VSG阻抗建模及阻抗扫描验证 虚拟同步发电机序阻抗建模 风机多端MMC 可设置扫描范围、扫描点数,附送讲解 程序附带注释,每一行都能看懂 包括vsg仿真模型&…...

【异常】OpenClaw 调用 API 限速报错 API rate limit reached. Please try again later.

一、报错内容 在使用 OpenClaw 进行接口调用时,系统返回以下报错信息: API rate limit reached. Please try again later. 同时提示当前订阅套餐已达到调用限额,需等待周期刷新或升级套餐,建议5小时后重新进行交互操作。 二、报错说明 1. 报错核心含义 本次报错的核心是…...

声源定位实战:从仿真到嵌入式落地

2022声源定位相关资料及代码 内附声源定位算法基本原理及matlab仿真原理及实现方法; stm32f4实现源码(2022电赛) 3米处水平横向精度0.013m(可优化更低)。 视频5s,无快进,mcu为stm32f429zit6。 …...

AI人脸隐私卫士实测:多人合照自动打码,效果惊艳

AI人脸隐私卫士实测:多人合照自动打码,效果惊艳 1. 引言:当合照遇上隐私,AI如何成为你的守护者? 你有没有过这样的经历?公司团建拍了张大合照,想发朋友圈分享喜悦,却要花上十几分钟…...

Vue 3 源码阅读笔记:ref.ts

文章目录一、文件概览二、核心数据结构1. Ref 接口定义三、核心函数实现1. isRef - 类型守卫2. r[ReactiveFlags.IS_REF]详解一、 r[ReactiveFlags.IS_REF] 是什么意思?二、这个标记是怎么来的?三、为什么需要这个标记?四、完整的标记系统五、…...

Java面向对象—反射

反射1、反射(Reflection):是Java被视为“动态”语言的关键,反射机制允许在执行期间借助于Reflection的API取得任何类(接口)的内部信息,并能直接操作任意对象的内部信息。2、Java反射机制主要提供了以下功能:(1&#xf…...

MATLAB高效声发射多通道数据分离与新数据集构建

matlab高效分离声发射各通道数据,构建新的数据集,亲测运行有效,小样本和大样本(百万级别)均适用,专业性和针对性强,确保运行无误可以直接最近在实验室折腾声发射数据,发现多通道采集的数据处理起来特别费劲…...

距离提交只剩3天,查重48%:毕业之家AI工具把我从延毕边缘拉了回来

毕业之家(官网https://www.biye.com)是聚焦国内高校论文全生命周期的 AI 学术服务平台,作为 PaperRed 核心合作与技术支撑方,以学术合规为核心、高效便捷为导向,打造了选题到答辩的一站式闭环服务,尤其针对…...

跨境卖家如何用品类矩阵规划减少对单一类目的依赖

在波谲云诡的跨境电商领域,许多卖家曾凭借一款爆品迅速崛起,却又因市场风向突变、政策调整或供应链断裂而骤然跌落。这种“成也萧何,败也萧何”的单一品类依赖症,已成为悬在众多跨境企业头上的达摩克利斯之剑。要构建可持续、抗风…...

Vue3+Element Plus实战:给el-dialog加个『老板键』(一键全屏/拖拽/记忆位置)

Vue3 Element Plus 弹窗『老板键』:全屏、拖拽与位置记忆的工程化实现 你是否遇到过这样的场景?正在一个复杂的后台管理系统中处理数据,弹窗里展示着关键图表或表单,突然需要快速切换到另一个应用,或者临时需要隐藏当…...

Java 面向对象设计题3

11. 用户类设计 11.定义一个用户类(User),包含用户名(username)和密码(password)属性,提供静态方法验证密码是否有效(长度至少为6),并提供getter和setter方法。 class User {private String username;private String password;public User(St…...

Visual Studio Code 安装和配置

一、VS Code 1. VS Code下载地址 官方下载地址:https://code.visualstudio.com/访问后页面会自动识别你的系统(Windows/macOS/Linux),显示对应版本的下载按钮,直接点击即可。 2. 安装步骤(以 Windows 为…...

回形取数-进阶题5

回形取数 题目 问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。输入说明 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数&am…...

ESP8266+Blinker打造智能家居远程控制开关

1. 从零开始:为什么选择ESP8266和Blinker? 如果你对智能家居感兴趣,想自己动手做个远程开关,控制家里的灯、风扇或者小电器,但又觉得那些成品智能插座太贵,或者功能不够灵活,那你今天算是来对地…...

OpenBMC实战指南(一):obmc-console服务端与客户端的深度解析

1. 初识obmc-console:它到底是什么,能帮你做什么? 如果你刚开始接触OpenBMC,可能会被一堆服务名搞得晕头转向。今天咱们就来聊聊其中一个非常核心,但又常常被误解的组件:obmc-console。简单来说&#xff0c…...

Ubuntu环境下离线部署Docker生态全攻略:从安装到镜像迁移

1. 为什么需要离线部署Docker?从企业内网说起 大家好,我是老张,在运维和开发这个行当里摸爬滚打了十几年,经手过不少企业级项目。今天想和大家聊聊一个非常实际,但又常常让新手头疼的场景:在完全没有外网的…...

【LWIP】MCU通过ICMP协议实现主动PING检测网络设备状态

1. 为什么你的MCU需要主动PING?一个真实的故事 大家好,我是老张,在嵌入式网络这块摸爬滚打了十几年。今天想和大家聊聊一个看似简单,但在实际项目中却至关重要的功能:让MCU主动去PING网络里的其他设备。 你可能已经用L…...

Flutter 三方库 dart_json_annotations 的鸿蒙化适配指南 - 定义严谨的数据契约、在鸿蒙端实现自动化 JSON 注解实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 dart_json_annotations 的鸿蒙化适配指南 - 定义严谨的数据契约、在鸿蒙端实现自动化 JSON 注解实战 前言 在进行 Flutter for OpenHarmony 的全场景应用开发时&#xff0…...

一文看懂AI智能体协议家族:MCP、A2A、ACP全解析,小白程序员必收藏

在AI智能体(Agent)迅猛发展的当下,MCP、A2A、ACP、UTCP、ANP……各种协议层出不穷,几乎每隔一段时间,科技公司就会为“字母家族”增添新成员。归根结底,所有AI智能体协议的目标都是标准化智能体的通信方式&…...

拒绝黑盒!一文看懂大模型底层原理与产品区别,小白程序员必收藏

在当今数字化时代,AI 大模型早已不是陌生词汇 —— 从日常聊天的 ChatGPT,到帮我们处理工作的智能助手,它正悄悄改变着我们的生活与工作节奏。但对大多数人来说,AI 大模型就像个 “黑盒子”:知道它好用,却搞…...

Flutter 三方库 w_transport 的鸿蒙化适配指南 - 构建高可靠网络传输层、实现鸿蒙端复杂协议交互实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 w_transport 的鸿蒙化适配指南 - 构建高可靠网络传输层、实现鸿蒙端复杂协议交互实战 前言 在开发 Flutter for OpenHarmony 大型商业应用时,简单的 HTTP 请求…...

Flutter 三方库 codenic_bloc_use_case 的鸿蒙化适配指南 - 践行整洁架构、在 BLoC 中优雅封装鸿蒙业务用例实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 codenic_bloc_use_case 的鸿蒙化适配指南 - 践行整洁架构、在 BLoC 中优雅封装鸿蒙业务用例实战 前言 在进行 Flutter for OpenHarmony 的大型项目开发时,复杂…...

Flutter 三方库 kiss_dependencies 的鸿蒙化适配指南 - 践行极简依赖注入、实现鸿蒙跨平台工程的高效解耦

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 kiss_dependencies 的鸿蒙化适配指南 - 践行极简依赖注入、实现鸿蒙跨平台工程的高效解耦 前言 在 Flutter for OpenHarmony 的实际开发中,随着业务逻辑从单一…...

3秒解锁百度网盘资源:零技术门槛的提取码查询工具使用指南

3秒解锁百度网盘资源:零技术门槛的提取码查询工具使用指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 资源获取的隐形墙:你是否也遇到这些困境? 想象这样的场景:设计师小陈…...

200年前的蒸汽机工人,其实早就预言了今天程序员的命运

最近看到一篇很有意思的文章,作者在读 OpenAI 关于“线束工程”(Harness Engineering)的博客时,突然意识到一件事:这个模式他见过,不止一次,而是三次。这三次跨越了两百多年,但本质上…...

告别提取码焦虑:零门槛百度网盘资源解锁工具让你秒级获取文件

告别提取码焦虑:零门槛百度网盘资源解锁工具让你秒级获取文件 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 一、被提取码困住的三个真实故事 医生王主任的紧急时刻 凌晨两点,急诊科王主任收到同事发…...

Windows Subsystem for Android (WSA) 实战指南:从环境搭建到高效应用

Windows Subsystem for Android (WSA) 实战指南:从环境搭建到高效应用 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 一、WSA技术解析&#xff…...