我们到底能走多远系列(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)的更多相关文章

  1. Ajax上传文件进度条显示

    要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...

  2. asp.net大文件上传与上传文件进度条问题

    利用Plupload解决大容量文件上传问题, 带进度条和背景遮罩层 关于Plupload结合上传插件jquery.plupload.queue的使用 这是群里面一位朋友给的资料. 下面是自己搜索到的一 ...

  3. php上传文件进度条

    ps:本文转自脚本之家 Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP 5.4以前 ...

  4. 折叠面板实现,上传文件进度条,三级联选择器,多级联选择器, 利用layui实现

    首先贴出html代码 <form class="layui-form" action=""> <div class="layui-f ...

  5. ajax上传文件进度条

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. html5异步上传图片显示上传文件进度条

    <html> <head> </head> <body> <p> emo_album_id:<input type="tex ...

  7. atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7

    atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...

  8. 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 ...

  9. Jquery.Uploadify实现批量上传显示进度条 取消 上传后缩略图显示 可删除

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="UpLoad.aspx.cs&q ...

随机推荐

  1. python中的urlencode与urldecode

    当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至'/'做一下编码转换. 所以对于一些中文或者字符,ur ...

  2. 本地电脑localhost指向127.0.0.1的配置

    windows系统电脑,我们如果想访问本机部署的项目,通常使用的是localhost来指向本机,但是有时候发现不行,我们不妨打开资源管理器,C:\Windows\System32\drivers\et ...

  3. mySql常用sql

    mysql sql语句大全1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server- ...

  4. C# WebBrowser NativeMethods

    using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using Syste ...

  5. Codeforces Round #249 (Div. 2)

    A.水题. #include <cstdio> #include <iostream> #include <cstdlib> #include <cstrin ...

  6. FMDB数据库中的一些操作

    #pragma mark - 数据库的操作 - (BOOL)judgeModel:(TaskResourceModel *)model isInArray:(NSArray *)shopArray { ...

  7. How To Create A Struts 2 Web Application

    以简单登录为例 1.创建一个Dynamic Web projec项目记得勾选Generate web.xml deployment dsecriptor 2.引入Struts 2工程所需运行库文件 解 ...

  8. 巧用nginx屏蔽对用户不可见的文件

    事情的起因是这样的--前端的项目中有一些.less之类的源文件,而为了方便迭代更新发布,直接就把整个工程放到了www目录下. 这样虽然方便了,但是会带来一些安全隐患——用户可以访问/盗取这些源文件. ...

  9. hdu 2030

    PS:原本这道题就空了好久...今天才去查了下汉字机内码... 然后才知道了. 1—— 一个汉字在字符串中是以两个负的字符形式存储,所以本题只要把字符串中负字符的个数找出来,再 除以2 就OK了. 2 ...

  10. 2016 - 1 - 20 runloop学习

    一:Runloop基本知识 1.本质就是运行循环 2.基本作用: 2.1保证程序持续运行 2.2处理APP中的各种事件:触摸,定时器,selector... 2.3节省CPU资源,系统程序性能:它会让 ...