webuploader后端开发要点

server/2025/3/26 0:50:06/

百度fex团队的webuploader是一个很方便的web页面文件上传轮子,可以很方便地集成到前端html和js里,当然了,后端需要咱们自己开发实现。比较遗憾的是webuploader现在已经从百度的fex主页移除了,该项目可能已经不再维护了。
关于后端,首先要实现以下几个服务:
1 文件(分片)上传 大文件是要分片上传的,不分片的话,受浏览器设置限制,最大似乎2GB,另外从客户端到服务器如果路上有nginx、F5等网关代理转发设施的话,也都会限制文件大小;另外都是小文件的话,你估计自己直接手传了,也没有必要用百度这个webuploader了
2 分片合并 前端把文件的所有分片都传完后,要向后端发起合并请求,后端开始将该文件的所有分片组装还原为原文件
3 合并进度查询 这个不是必须的,但是为了消减用户传完大文件后的等待焦虑,可以考虑在前端动态展示后端的合并进度,完成后再允许后续操作,否则,用户盲点可能导致后台任务冲突。

//前端提交时带入一个reqid参数,标识请求ID,在用户进入文件上传页面时随机生成
app.post('/upload_chunks', multer({dest: jargs.chunkDir}).array('file'), (req, res, next)=> {let obj= req.body;let chunkpath = req.files[0].path;// 原始片段在临时目录下的路径let chunkid = (obj.chunk)?Number(obj.chunk):0;let chunkitem=JSON.parse(JSON.stringify({"reqid":obj.reqid,"filename":obj.name,"chunkid":chunkid,"chunkpath":chunkpath}));//维护一个列表保存当前已传输分片filechunkpath.push(chunkitem);res.json({'status': 1});
});

文件就存于临时目录,路径维护在列表中,效率最好。

//分片写入目标文件
function mergechunk(chunkpath, chunkid, targetFile){let start = chunkid * jargs.chunkSize;return new Promise((resolve,reject)=>{pipeline( fs.createReadStream(chunkpath), fs.createWriteStream(targetFile, { flags:'r+', start:start }), (err) => { if (err) { reject(err);}  fs.unlink(chunkpath,(err1)=>{ if (err1) reject(err1); resolve(); }); });});
}

文件分片合并可以并发进行,每个分片写入目标的偏移量。

//提供合并查询服务
app.get('/query/:reqid', (req, res) => {if (req.query.filename==undefined) {let ready=filechunkpath.find(item=>(item.reqid==req.params.reqid));let retcode=(ready!=undefined)?'0':'1';res.json({'status':retcode});}else {let target=filemergeprogress.find(itm=>((itm.reqid==req.params.reqid)&&(itm.filename==mydecode(req.query.filename))));if (target==undefined) { res.json({'status':100}); }else { res.json({'status':parseInt(target.done*100/target.total)}); }}
});

http://www.ppmy.cn/server/726.html

相关文章

基于51单片机的自行车测速里程码表设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机的自行车测速里程码表设计 1. 主要功能:2. 讲解视频:3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接: 基于51单片机的自行车测速里程码表设计( proteus仿真程序设计报告原理图讲解视频)…

微信小程序二维码

目录 前言小程序二维码不限制数量的小程序码微信小程序官方文档:获取不限制数量的小程序码小程序里面中接收不限制数量的小程序码传递的参数 普通链接二维码微信小程序官方文档:扫普通链接二维码打开小程序小程序里面中接收普通链接二维码传递的参数 前言…

springboot2集成东方通tongweb嵌入式版

由于最近项目需要国产化信创改造,引入东方通tongweb 联系东方通厂家 ,将依赖导入到maven仓库,并获取嵌入式版license文件修改pom.xml,引入依赖,注意springboot版本,这里以springboot2举例 首先移除springb…

图与图搜索算法

图搜索算法是一个非常重要的概念,它是计算机科学中图论和算法设计的基础部分。在开始讨论图搜索算法之前,我们需要先理解什么是图以及图的基本结构。 什么是图? 图(Graph)是一种非线性数据结构,它由一组点…

基于XML配置bean(二)

文章目录 1.工厂中获取bean1.静态工厂1.MyStaticFactory.java2.beans.xml3.测试 2.实例工厂1.MyInstanceFactory.java2.beans.xml3.测试 3.FactoryBean(重点)1.MyFactoryBean.java2.beans.xml3.测试 2.bean配置信息重用继承抽象bean1.beans.xml2.测试 3.…

IO多路转接之epoll

目录 1. 简单认识下 epoll 相关接口 2. epoll 原理 2.1. 前置性认识 2.2. epoll 底层原理 2.2.1. 红黑树 2.2.2. 就绪队列 2.2.3. 回调机制 2.3. 红黑树和就绪队列 2.3.1. eventpoll 结构 2.3.2. epitem 结构 2.4. 总结 3. epoll 实例 3.1. epoll_event &&am…

python 文件输入输出

python 文件输入输出 一、输入输出1. 输出格式美化2. 旧式字符串格式化3. 读取键盘输入4. 读和写文件5. 文件对象的方法6. pickle 模块 二、文件操作1. File(文件) 方法2. mode 参数有:3. file 对象 三、 OS 文件操作1. OS 文件/目录方法 四、代码概览(输…

Vue源码解读学习

Vue源码 观察者模式 & 发布订阅 观察者模式:中心一对多 系统单点间的灵活和拓展(广播的方式) 发布订阅:将注册列表遍历发布给订阅者 initInject initState initProvide他们挂载顺序为什么这样设计? initstate…