node实现http上传文件进度条 -我们到底能走多远系列(37)
我们到底能走多远系列(37)
扯淡:
又到了一年一度的跳槽季,相信你一定准备好了,每每跳槽,总有好多的路让你选,我们的未来也正是这一个个选择机会组合起来的结果,所以尽可能的找出自己想要的是什么再做决定。共勉!
主题:
实现上传文件时,在页面中展现进度条的基本原理如图:
1,客户端先发起上传文件请求,上传文件未结束前,后台实时的把已经上传的百分比存进session中(也可以使用像redis这样的数据库)。
2,在上面这个过程中,客户端不断向服务端请求获取文件上传百分比,然后展现在页面上。
3,直到全部上传完毕,上传文件响应返回。
1,上传文件:
要实现上传文件进度条,先保证上传时页面不跳转,所以需要使用模拟ajax上传的方式。
这儿就使用了比较简单的ajaxupload,在以前的 文章中也有提到。
关于页面不跳转上传文件可以参考阮一峰的文章: 参考
2,将文件上传比例放入session
我这里使用了formidable,地址,利用下面的代码就可以监控上传过程:
form.on('progress', function(bytesReceived, bytesExpected) {
});
然后再里面将上传百分比放进session即可。这里session的实现可以阅读 上篇文章!
上传文件的代码:
exports.jupload = function(sessions){
console.log("jupload");
return function(req, res) {
var form = new formidable.IncomingForm();
form.uploadDir = __dirname;
form.parse(req, function(err, fields, files) {
//res.writeHead(200, {'content-type': 'text/plain'});
//res.write('Received upload:\n\n');
var exts = files.ajaxfile.name.split('.');
var ext = exts[1];
var date = new Date();
var ms = Date.parse(date);
fs.renameSync(files.ajaxfile.path, __dirname +"/uploadfiletmp/" + ms +"." + ext);
});
var opts = {
name : "uploadprogress",
value : 0,
expires : 500
}; sessions.setSession(req,res,opts);
//文件上传中事件
form.on("progress", function (bytesReceived, bytesExpected) {
//console.log("progress!" + bytesReceived +"____" + bytesExpected);
// 百分比
var percent = Math.round(bytesReceived/bytesExpected * 100);
var opts = {
name : "uploadprogress",
value : percent,
expires : 500
};
// 存入
sessions.setSession(req,res,opts);
});
form.on('end', function() {
res.render("upload",{data : ""});
});
};
// form.on("complete", function (err) {
// console.log("complete!");
// });
};
注意:上面的代码中监听的end事件,等到上传结束时才进行返回操作,是为了避免重新写headers的错误:
http.js:704
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
3,客户端不断请求获取文件上传百分比
我们只要在页面上弄个定时,发起ajax请求百分比,然后判断百分比如果达到100,而停止。
下面是两个请求的js代码:
function aupload(fileElementId){
$("#progress").css("width", "0%");
// 发起上传文件请求
$.ajaxFileUpload({
url:"/jupload",
fileElementId:fileElementId,
success:function(){
alert("上传成功");
}
});
// 获取文件上传百分比
getUploadProgress();
} function getUploadProgress(){
var progress = 0;
$.ajax({
url : "/uploadprogress",
dataType: "json",
success:function(msg){
//百分比
progress = msg.progress;
$("#progress").css("width", progress +"%");
if(progress < 100){
// 继续调用
setTimeout("getUploadProgress('/uploadprogress')",1);
}
}
})
}
以及后台返回进度百分比的代码:
exports.uploadprogress = function(sessions){
return function(req, res) {
// 从session中获取
var progress = sessions.getSession(req, "uploadprogress");
console.log(progress+"---------------------");
res.send({"progress":progress});
}
};
4,页面上进度条的展现
这里使用了bootstrap
其中有一个Progress bars的插件:demo
下面代码就可以改变进度条的百分比了
$("#progress").css("width", progress +"%");
注意:这里不能使用attr方法,具体的区别是:
css设置style里的样式
attr设置属性
让我们继续前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不会成功。
node实现http上传文件进度条 -我们到底能走多远系列(37)的更多相关文章
- Ajax上传文件进度条显示
要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...
- asp.net大文件上传与上传文件进度条问题
利用Plupload解决大容量文件上传问题, 带进度条和背景遮罩层 关于Plupload结合上传插件jquery.plupload.queue的使用 这是群里面一位朋友给的资料. 下面是自己搜索到的一 ...
- php上传文件进度条
ps:本文转自脚本之家 Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP 5.4以前 ...
- 折叠面板实现,上传文件进度条,三级联选择器,多级联选择器, 利用layui实现
首先贴出html代码 <form class="layui-form" action=""> <div class="layui-f ...
- ajax上传文件进度条
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- html5异步上传图片显示上传文件进度条
<html> <head> </head> <body> <p> emo_album_id:<input type="tex ...
- atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7
atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...
- atitit. 文件上传带进度条 atiUP 设计 java c# php
atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.x ...
- Jquery.Uploadify实现批量上传显示进度条 取消 上传后缩略图显示 可删除
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="UpLoad.aspx.cs&q ...
随机推荐
- java之进制转换
[转载]晨风�0�5�0�2�0�1�6�6 2014年03月08日 于 爱Java 发表 众所周知.程序世界计算机中采用的是二进制,一个数字可以用任意进制表示.所以看一个数据值的同时.还要观察它的进 ...
- 二模 (8) day1
第一题: 题目大意: 梦幻城市每年为全市高中生兴办一次运动会.为促使各校同学之间的交流,采用特别的分队方式:每一个学校的同学,必须被均匀分散到各队,使得每一队中该校的人数皆相同.为增加比赛的竞争性,希 ...
- angular-xeditable
http://vitalets.github.io/angular-xeditable/#text-simple ng-repeat="user in users" e-rows= ...
- Hibernate中的一对一映射
1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...
- C语言输出规定长度的整数,不够位数前面补零
今天在做ACM题目的时候,遇到了这么一个问题,还真别说,这个以前真的没用过,当时就傻掉了,还好这个世界有Google,通过搜索了解了输出这种格式的C语言实现方法.但是没有找到C++的实现方法,希望知道 ...
- [windows驱动]基本概念
https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554721 1.设备节点和设备堆栈 在windows中,设备通过即插即用设备树 ...
- 跨域请求之jQuery的ajax jsonp的使用解惑
前天在项目中写的一个ajax jsonp的使用,出现了问题:可以成功获得请求结果,但没有执行success方法,直接执行了error方法提示错误——ajax jsonp之前并没有用过,对其的理解为跟普 ...
- Oracle GoldenGate 12c 新特性
针对Oracle 12c的专门优化: 针对Oracle数据库的集成交付模式:提升在oracle DB中目标端的交付速度: 针对非Oracle数据库的协调交付模式:降低非oracle DB中多线程配置的 ...
- self.view 的不当操作造成死循环
如题,在创建ContentView的时候,例子如下 NSString *viewClassName = NSStringFromClass([self class]); viewClassName = ...
- EAX、ECX、EDX、EBX寄存器的作用
注意:在计算加法时,实在32位的累加器上进行,并注意类型之间的转换,数据的截取问题 一般寄存器:AX.BX.CX.DXAX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器 ...