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 相关文章推荐
5款Javascript颜色选择器
Oct 25 Javascript
JavaScript学习笔记之获取当前目录的实现代码
Dec 14 Javascript
关于javascript event flow 的一个bug详解
Sep 17 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
使用时间戳解决ie缓存的问题
Aug 20 Javascript
jQuery代码实现发展历程时间轴特效
Jul 30 Javascript
一步步教大家编写酷炫的导航栏js+css实现
Mar 14 Javascript
详解js中Json的语法与格式
Nov 22 Javascript
js的各种数据类型判断的介绍
Jan 19 Javascript
javaScript中indexOf用法技巧
Nov 26 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
Apr 13 Javascript
js实现点击上传图片并设为模糊背景
Aug 02 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的历史和优缺点
2006/10/09 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP中的正则表达式实例详解
2017/04/25 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
基于react组件之间的参数传递(详解)
2017/09/05 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
2020/04/27 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
如何管理Vue中的缓存页面
2021/02/06 Vue.js
python中set常用操作汇总
2016/06/30 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
python实现名片管理系统项目
2019/04/26 Python
Python实现字符串中某个字母的替代功能
2019/10/21 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
超级实用的8个Python列表技巧
2020/08/24 Python
通过代码实例了解Python异常本质
2020/09/16 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
竞争与合作演讲稿
2014/05/12 职场文书
区域经理岗位职责
2015/02/02 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python