关于文件上传的前后端优化

此前做过单文件、多文件上传和大文件分片上传,虽然功能有了,效果也还可以。不过最近重新思考一下,突然注意到一个重要的事情,大文件上传中,系统做了很多无用功,导致效率太低!

怎么说呢?是这样的,大文件上传,我前端采用的是百度的webuploader,后端用nodejs+express+multer。webuploader在前端分片上传,后端收到的分片存为临时文件,全部传完后,前端发消息到后端执行分片合并,表面上没有毛病,其实我完全是被webuploader给忽悠瘸了,因为分片合并根本就不是必要的!

multer支持将formdata传来的文件存为硬盘文件,其实也可以缓存在memoryStorage ,我们可以直接写入目标文件的特定位置,根本不必要将分片写入临时文件,再在完成所有分片时将临时文件读取写入到目标文件。假设读写一个分片的开销都是1,那么写入分片读取分片写入目标的开销就是3了,而实际上我们直接写入目标就可以了,代价是1,相当于我们的效率只有1/3,做了2/3的无用功。

javascript 复制代码
const multer = require('multer');
const storage = multer.memoryStorage();
const uploader = multer({ storage: storage });
const stream = require('stream');
...
app.post('/upload_chunks', multer().array('file'), (req, res, next)=> {
	let obj= req.body;
	let dest_path = jargs.destDir+"/"+obj.reqid+"/"+ obj.name;
	let chunkid = (obj.chunk)?Number(obj.chunk):0;
	pipeline( new stream.PassThrough().end(req.files[0].buffer), fs.createWriteStream(dest_path, { flags:'r+', start:chunkid*jargs.chunkSize }), (err) => { if (err) { res.json({'status': 0}); } else { res.json({'status': 1}); } });
});

app.post('/createfile', (req, res) => {
	let dest_path = jargs.destDir+"/"+req.body.reqid+"/"+ req.body.filename;
	fs.writeFile(dest_path, '', (error) => { 
		if (error) { 
			logger.error("创建文件失败 "+dest_path); 
			res.json({'status': 0}); 
			} 
		else {
			res.json({ 'status': 1 });
			}
		});
});

后端有两个接口,一个是分片上传,另一个是创建目标文件,要在分片上传前执行,前端是webuploader的话,就在fileQueued里调用执行。

更改后,前后段代码一下子减少了一大半,没有分片合并了,没有合并进度查询了,对服务器空间占用需求也减少了,速度还大幅度提升了。。。

相关推荐
渡我白衣5 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
八角丶6 小时前
Node 网络编程 —— TLS 模块
javascript·后端·node.js
倔强的石头1066 小时前
【Linux指南】动静态库系列(七):符号表与重定位:链接器如何把函数调用接起来
linux·前端·javascript
图扑软件7 小时前
中篇・运笔|统一 DataModel 底座,HT UI 组件万物同源
javascript·低代码·ui·性能优化·数据可视化
小小尚@8 小时前
WebGIS/ECharts 地图开发|MapLand 在线行政区划边界一键下载 GeoJSON 工具
前端·javascript·echarts
葡萄城技术团队8 小时前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
默_笙9 小时前
🚍 一条 Todo 的奇幻漂流:TypeScript 全栈类型安全的"护照检查"
前端·javascript
weixin_4225554210 小时前
el-menu子菜单点击就被激活,恢复之前的激活状态
javascript·vue.js·elementui
嘿嘿-6611 小时前
Cherry Studio 接入ChatGpt:GPT-5.6 Sol 文本测试与 GPT-Image-2 出图教程
人工智能·gpt·ai·chatgpt·node.js·ai编程
大牧师11 小时前
TypeORM 学习教程
数据库·sql·学习·node.js·orm·nest.js·typeorm