当前位置: 首页 > 后端技术 > Node.js

Node.js:上传文件,服务器端如何获取文件上传进度

时间:2023-04-03 13:28:01 Node.js

内容概述multer是一个常用的Express文件上传中间件。服务器如何获取文件上传进度,是使用过程中很常见的问题。也有同学在顺丰《nodejs multer有没有查看文件上传进度的方法?》上问了类似的问题。稍微回答了下,这里顺便整理一下,有相同问题的同学可以参考一下。下面主要介绍如何使用progress-stream获取文件上传进度,以及使用该组件时的注意事项。使用progress-stream获取文件上传进度。如果只是想在服务器端获取上传进度,可以试试下面的代码。请注意,此模块与Express和multer没有强绑定,可以独立使用。varfs=require('fs');varexpress=require('express');varmulter=require('multer');varprogressStream=require('progress-stream');varapp=express();varupload=multer({dest:'upload/'});app.post('/upload',function(req,res,next){//创建进度流实例varprogress=progressStream({length:'0'});//注意这里的长度设置为'0'req.pipe(progress);progress.headers=req.headers;//获取上传文件的实际长度(对于multipart)progress.on('length',functionnowIKnowMyLength(actualLength){console.log('actualLength:%s',actualLength);progress.setLength(actualLength);});//获取上传进度progress.on('progress',function(obj){console.log('progress:%s',obj.percentage);});//实际上传文件upload.single('logo')(progress,res,next);});app.post('/upload',function(req,res,next){res.send({ret_code:'0'});});app.get('/form',function(req,res,next){varform=fs.readFileSync('./form.html',{编码:'utf8'});res.send(form);});app.listen(3000);如何获取上传文件multipart类型的真实大小,需要监听长度来获取文件的真实大小(官方文档是通过定罪事件,其实是有问题的)//获取实际长度上传的文件(对于多部分)progress.on('length',functionnowIKnowMyLength(actualLength){console.log('actualLength:%s',actualLength);progress.setLength(actualLength);});关于progress-stream获取实际文件大小的错误?对于multipart文件上传,初始化progress-stream实例时,参数length需要传一个非数值类型,否则得到的progress永远是0,最后直接跳到100。至于为什么会这样,应该是progress-steram模块的bug,查看模块源码。当length是number类型时,代码直接跳过,所以你的length一直被认为是0。tr.on('pipe',function(stream){if(typeoflength==='number')return;//支持http模块if(stream.readable&&!stream.writable&&stream.headers){returnonlength(parseInt(stream.headers['content-length']||0));}//支持具有长度属性的流if(typeofstream.length==='number'){returnonlength(stream.length);}//支持请求模块stream.on('response',function(res){if(!res||!res.headers)return;if(res.headers['content-encoding']==='gzip')return;if(res.headers['content-length']){returnonlength(parseInt(res.headers['content-length']));}});});参考链接https://github.com/expressjs/multer/issues/243https://github.com/freeall/progress-stream