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


    此前做过单文件、多文件上传和大文件分片上传,虽然功能有了,效果也还可以。不过最近重新思考一下,突然注意到一个重要的事情,大文件上传中,系统做了很多无用功,导致效率太低!
    怎么说呢?是这样的,大文件上传,我前端采用的是百度的webuploader,后端用nodejs+express+multer。webuploader在前端分片上传,后端收到的分片存为临时文件,全部传完后,前端发消息到后端执行分片合并,表面上没有毛病,其实我完全是被webuploader给忽悠瘸了,因为分片合并根本就不是必要的!
    multer支持将formdata传来的文件存为硬盘文件,其实也可以缓存在memoryStorage ,我们可以直接写入目标文件的特定位置,根本不必要将分片写入临时文件,再在完成所有分片时将临时文件读取写入到目标文件。假设读写一个分片的开销都是1,那么写入分片读取分片写入目标的开销就是3了,而实际上我们直接写入目标就可以了,代价是1,相当于我们的效率只有1/3,做了2/3的无用功。

    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 });
    			}
    		});
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    后端有两个接口,一个是分片上传,另一个是创建目标文件,要在分片上传前执行,前端是webuploader的话,就在fileQueued里调用执行。
    更改后,前后段代码一下子减少了一大半,没有分片合并了,没有合并进度查询了,对服务器空间占用需求也减少了,速度还大幅度提升了。。。

  • 相关阅读:
    保险项目中的一些名词解释
    Spark SQL
    多继承的实例介绍
    C++核心编程--继承篇
    振南技术干货集:深入浅出的Bootloader(4)
    怎么样的框架对于开发者是友好的?
    cadence SPB17.4 - CIS DB - add MECHANICAL part
    “重保季”来临,网站及业务系统拒绝“裸奔”与“带病在线”!
    计算机组成原理习题课第一章-2(唐朔飞)
    虚拟机上部署K8S集群
  • 原文地址:https://blog.csdn.net/dgiij/article/details/138035369