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 相关文章推荐
javascript iframe内的函数调用实现方法
Jul 19 Javascript
extjs 为某个事件设置拦截器
Jan 15 Javascript
html组件不可输入(只读)同时任何组件都有效
Apr 01 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
Jan 08 Javascript
用js将内容复制到剪贴板兼容浏览器
Mar 18 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
Jun 02 Javascript
Javascript Object 对象学习笔记
Dec 17 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
JavaScript实现QQ列表展开收缩扩展功能
Oct 30 Javascript
详解webpack自定义loader初探
Aug 29 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
Jun 03 Javascript
Vue开发中常见的套路和技巧总结
Nov 24 Vue.js
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检测文件编码的方法示例
2014/04/25 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
js获取网页高度(详细整理)
2012/12/28 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
Python制作词云图代码实例
2019/09/09 Python
Python自带的IDE在哪里
2020/07/01 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
教师实习自我鉴定
2013/12/11 职场文书
个人简历自我评价
2014/01/06 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
上海世博会口号
2014/06/19 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
2015年公务员工作总结
2015/04/24 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电