1、先上核心工具类
/**
* Created by Administrator on 2017/6/12.
*/
let fs = require("fs");
/**
* Created by ZHX on 2017/6/12.
*/
function UploadFile(debug,file,tokenUrl,postUrl,params,progressFun,endFun){
this.tokenUrl = tokenUrl;
this.postUrl = postUrl;
this.params = params;
this.file = file;
this.progressFun = progressFun;
this.endFun = endFun;
this.debugFun = debug;
} UploadFile.prototype = {
tokenUrl:"",
postUrl:"",
file:"",
progressFun:"",
endFun:"",
buf:null,
// 块大小 10M.
filePiece:10485760,
xhrHandler:"",
XHR:"",
params:{},
// 记录每次开始位置
bytesStart:0,
debugFun:null,
upload:function(){
var self = this;
/** request the server to figure out what's the token for the file: */
var xhr = new XMLHttpRequest; var vars = {
name: this.file['name'],
size: this.file['size'],
};
var tokenUrl = fAddVars(vars, this.tokenUrl) + "&" + fGetRandom();
xhr.open("GET", tokenUrl, !0);
xhr.onreadystatechange = function() {
if (xhr.readyState != 4 || xhr.status < 200)
return false;
var token;
token = eval("(" + xhr.responseText + ")").token;
self.postUrl = fAddVars(
fMergeJson({token,size:self.file.size,name:self.file.name},self.params),
self.postUrl);
self.uploadFile(0);
}
xhr.send();
},
uploadFile(pos){
this.buf = new Buffer(this.filePiece);
this.bytesStart = pos;
let fileSize = this.file.size;
let self = this;
fs.read(this.file.fd,this.buf,0,this.buf.length,pos,function(err, bytesRead, buffer) {
try{
self.XHR = new XMLHttpRequest;
var _xhr = self.XHR, upload = _xhr.upload;
self.xhrHandler = fExtend(self.loadHandler, self);
upload.addEventListener("progress", self.xhrHandler, !1);
_xhr.addEventListener("load", self.xhrHandler, !1);
_xhr.addEventListener("loadend", self.xhrHandler, !1);
let range = "bytes "+ pos + "-"+ (pos + buffer.length) + "/" + fileSize;
_xhr.open("POST", self.postUrl, !0);
_xhr.setRequestHeader("Content-Range", range);
var blob = new Blob([buffer.buffer]);
self.debugFun(blob);
_xhr.send(blob);
}catch(e)
{
alert(e);
}
});
},
loadHandler(event){
var xhr = this.XHR;
switch(event.type){
case "load":
this.debugFun("load");
var uploaded = 0;
var respJson = null;
var bError = !1;
// try {
//
// } catch(e) {
// bError = this.retriedTimes > 2;
// if (!bError) {
// // this.retry();
// return;
// }
// }
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 308)) {
uploaded = (respJson = eval("(" + xhr.responseText + ")")) ? respJson.start : -1;
} else if (xhr.status < 500 && xhr.status >= 400) {
bError = !0;
} else if (xhr.status < 200) {return;}
/** the response can't process the request, so throws out the error. */
bError = bError || respJson.success == false; //check whether upload complete yet
if(uploaded < this.file.size -1) {
this.retriedTimes = 0;
this.uploadFile(uploaded);
} else {
this.endFun();
}
break;
case "loaded":
this.debugFun('.......................loading');
break;
case "progress":
this.debugFun('progress-->'+this.bytesStart);
this.progressFun(this.bytesStart + event.loaded);
break;
}
}
}; function fExtend(a, b){
var c = 2 < arguments.length ? [arguments[2]] : null;
return function(){
var d = "string" === typeof a ? b[a] : a,e=c ? [arguments[0]].concat(c) : arguments;
return d.apply(b||d, e);
};
} function fAddVars(json, url, c) {
var _array = [], _sep = "&", f = function(json, c) {
var e = url ? /\[\]$/.test(url) ? url : url + "[" + c + "]" : c;
"undefined" != e && "undefined" != c
&& _array.push("object" === typeof json
? fAddVars(json, e, !0)
: "[object Function]" === Object.prototype.toString.call(json)
? encodeURIComponent(e) + "=" + encodeURIComponent(json())
: encodeURIComponent(e) + "=" + encodeURIComponent(json))
};
if (!c && url)
_sep = /\?/.test(url) ? /\?$/.test(url) ? "" : "&" : "?",
_array.push(url),
_array.push(fAddVars(json));
else if ("[object Array]" === Object.prototype.toString.call(json)
&& "undefined" != typeof json)
for (var g = 0, c = json.length; g < c; ++g)
f(json[g], g);
else if ("undefined" != typeof json && null !== json && "object" === typeof json)
for (g in json)
f(json[g], g);
else
_array.push(encodeURIComponent(url) + "=" + encodeURIComponent(json));
return _array.join(_sep).replace(/^&/, "").replace(/%20/g, "+")
} function fGetRandom() {
return (new Date).getTime().toString().substring(8);
} function fMergeJson(base, extend) {
var result = {};
for (var attr in base)
result[attr] = base[attr];
for (var attr in extend)
result[attr] = extend[attr];
return result;
} module.exports = UploadFile; 2、file 文件格式:

① 通过fs.stat获取文件信息;
② 通过fs.open获取fd;
代码如下:
fs.stat(vf.path,function(err,stats){
fs.open(vf.path,'r',function(err,fd){
let lu = new LoadUtil(debug,{size:stats.size,name:util.getImageName(vf.path),fd:fd},backIp.ip+vf.tk,backIp.ip+vf.url,
{id:vf.id},
function(pro){
send({type:"progress",data:{id:vf.id,progress:Math.round(pro/stats.size*100)}});
},function(){
send({type:"loaded",data:{id:vf.id}});
});
lu.upload();
});
});
												

nwjs 实现的 分块上传的更多相关文章

  1. PHP搭建大文件切割分块上传功能

    背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...

  2. HTML5+AJAX原生分块上传文件的关键参数设置

    processData:false 这是jquery.ajax的一个参数.默认值为true,表示会将非字符串对象自动变成k1=v1&k2=v2的形式,例如一个数组参数{d:[1,2]},到服务 ...

  3. Aliyun OSS SDK 异步分块上传导致应用异常退出

    问题描述: 使用Aliyun OSS SDK的BeginUploadPart/EndUploadPart执行异步分块上传操作,程序出现错误并异常退出! 原因分析: Using .NET Framewo ...

  4. 使用HTML5 FormData对象实现大文件分块上传(断点上传)功能

    FormData是HTML5新增的一个对象,通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对.它可以更灵活方便的发送表单数据,因为可以独立于表单使用.如果你把表单 ...

  5. Azure Storage 分块上传

    概述 Azure 存储提供三种类型的 Blob:块 Blob.页 Blob 和追加 Blob.其中,块 Blob 特别适用于存储短的文本或二进制文件,例如文档和媒体文件. 块 Blob 由块组成,每个 ...

  6. net core分块上传文件

    net core分块上传文件   写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...( ...

  7. 前端js怎么实现大文件G级的断点续传(分块上传)和分段下载

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  8. 一、.Net Core 分块上传文件

    一..Net Core 分块上传文件 一.前端实现 @* For more information on enabling MVC for empty projects, visit http://g ...

  9. springboot集成websocket实现大文件分块上传

    遇到一个上传文件的问题,老大说使用http太慢了,因为http包含大量的请求头,刚好项目本身又集成了websocket,想着就用websocket来做文件上传. 相关技术 springboot web ...

随机推荐

  1. nginx缓存功能的设置

    首先用的缓存是proxy_cache. 在http段里加入下列几句: [plain] view plain copy   proxy_connect_timeout 5; proxy_read_tim ...

  2. UOJ 171 【WC2016】挑战NPC

    一开始还真没想到是一般图匹配这种模型(毕竟才会的带花树) 把每一个盒子拆成3个,每一个可以放置进它的小球分别向这三个点连边,然后这三个点在连成一个三元环,最终答案就是小球数目-匹配数. 由于是一般图, ...

  3. Python四大主流网络编程框架

    目前的4种主流Python网络框架:Django.Tornado.Flask.Twisted.

  4. c 宏的定义

    #include <stdio.h> #include <conio.h> #define VAL 40 #ifdef VAL #undef VAL #endif #defin ...

  5. 更换主机后SSH无法登录的问题

    之前通过SSH远程一台机器(起个名字:cc),某一天把cc重装了一下系统,再SSH时显示密钥验证失败: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  6. Could not find a package configuration file provided by 'ecl_geometry' ,.................couldn't find required component 'ecl_geometry'

    sudo apt-get install ros-kinetic-ecl-geometry

  7. Springboot 编码规范

    1.规范的意义和作用 编码规范可以最大限度的提高团队开发的合作效率 编码规范可以尽可能的减少一个软件的维护成本 , 并且几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 编码规范可以 ...

  8. CCF 100012. 技能树

    100012. 技能树 思路:区间dp. 状态:dp[i][j]表示节点为i,高度小于等于j的方案数. 状态转移:dp[i][j]=∑dp[k][j-1]*dp[i-1-k][j-1]. 节点为i,高 ...

  9. Myeclipse2016安装Aptana

    Myeclipse2016安装Aptana 想装个Aptana,装了半天,网上说的什么links方式啊,在线方式啊,都是什么的浮云. 所以自己来写个安装教程. 一.Aptana简要介绍 Aptana有 ...

  10. 笔试题-sql语句

    今天遇到了不熟练(不会)的查询题目 回来自己又做了一下,如下 建表语句 -- Table structure for score -- ---------------------------- DRO ...