Node.js上传文件功能之服务端如何获取文件上传进度


Posted in Javascript onFebruary 05, 2018

内容概述

multer是常用的Express文件上传中间件。服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题。在SF上也有同学问了类似问题《nodejs multer有没有查看文件上传进度的方法?》。稍微回答了下,这里顺便整理出来,有同样疑问的同学可以参考。

下文主要介绍如何利用progress-stream获取文件上传进度,以及该组件使用过程中的注意事项。

利用progress-stream获取文件上传进度

如果只是想在服务端获取上传进度,可以试下如下代码。注意,这个模块跟Express、multer并不是强绑定关系,可以独立使用。

var fs = require('fs');
var express = require('express');
var multer = require('multer');
var progressStream = require('progress-stream');
var app = express();
var upload = multer({ dest: 'upload/' });
app.post('/upload', function (req, res, next) {
  // 创建progress stream的实例
  var progress = progressStream({length: '0'}); // 注意这里 length 设置为 '0'
  req.pipe(progress);
  progress.headers = req.headers;
  // 获取上传文件的真实长度(针对 multipart)
  progress.on('length', function nowIKnowMyLength (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){
  var form = fs.readFileSync('./form.html', {encoding: 'utf8'});
  res.send(form);
});
app.listen(3000);

如何获取上传文件的真实大小

multipart类型,需要监听length来获取文件真实大小。(官方文档里是通过conviction事件,其实是有问题的)

// 获取上传文件的真实长度(针对 multipart)
progress.on('length', function nowIKnowMyLength (actualLength) {
  console.log('actualLength: %s', actualLength);
  progress.setLength(actualLength);
});

3、关于progress-stream获取真实文件大小的bug?

针对multipart文件上传,progress-stream 实例子初始化时,参数length需要传递非数值类型,不然你获取到的进度要一直是0,最后就直接跳到100。

至于为什么会这样,应该是 progress-steram 模块的bug,看下模块的源码。当length是number类型时,代码直接跳过,因此你length一直被认为是0。

tr.on('pipe', function(stream) {
  if (typeof length === 'number') return;
  // Support http module
  if (stream.readable && !stream.writable && stream.headers) {
    return onlength(parseInt(stream.headers['content-length'] || 0));
  }
  // Support streams with a length property
  if (typeof stream.length === 'number') {
    return onlength(stream.length);
  }
  // Support request module
  stream.on('response', function(res) {
    if (!res || !res.headers) return;
    if (res.headers['content-encoding'] === 'gzip') return;
    if (res.headers['content-length']) {
      return onlength(parseInt(res.headers['content-length']));
    }
  });
});

总结

以上所述是小编给大家介绍的Node.js上传文件功能之服务端如何获取文件上传进度,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery滚动加载图片效果的实现
Mar 06 Javascript
js正文内容高亮效果的实现方法
Jun 30 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
May 09 Javascript
javascript如何写热点图
Dec 08 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
老生常谈js-react组件生命周期
May 02 Javascript
js图片轮播插件的封装
Jul 21 Javascript
Cpage.js给组件绑定事件的实现代码
Aug 31 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 Javascript
javascript实现抢购倒计时程序
Aug 26 Javascript
vscode 调试 node.js的方法步骤
Sep 15 Javascript
javascript实现最长公共子序列实例代码
Feb 05 #Javascript
JS设计模式之访问者模式定义与用法分析
Feb 05 #Javascript
基于vue 动态加载图片src的解决方法
Feb 05 #Javascript
vue2.0 datepicker使用方法
Feb 04 #Javascript
js数组常用最重要的方法
Feb 04 #Javascript
jQuery Dom元素操作技巧
Feb 04 #jQuery
Vue的事件响应式进度条组件实例详解
Feb 04 #Javascript
You might like
php日历[测试通过]
2008/03/27 PHP
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
javascript 清除输入框中的数据
2009/04/13 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
用Node提供静态文件服务的方法
2018/07/06 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
python小白学习包管理器pip安装
2020/06/09 Python
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
工商企业管理应届生求职信
2013/11/03 职场文书
教师自我评价范文
2013/12/16 职场文书
新任教师自我鉴定
2014/02/24 职场文书
导师工作推荐信范文
2014/05/17 职场文书
环境整治工作方案
2014/05/18 职场文书
三八妇女节标语
2014/10/09 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
Nginx利用Logrotate实现日志分割
2022/05/20 Servers
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers
TypeScript 内置高级类型编程示例
2022/09/23 Javascript