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. 机器学习 MLIA学习笔记(二)之 KNN算法(一)原理入门实例

    KNN=K-Nearest Neighbour 原理:我们取前K个相似的数据(排序过的)中概率最大的种类,作为预测的种类.通常,K不会大于20. 下边是一个简单的实例,具体的含义在注释中: impor ...

  2. Excel表格的导入导出

    Excel文件的组成: 01.一个Excel文件由N个Sheet组成的 02.一个Sheet由N个Row组成 03.一个Row由N个Cell组成 需求: 把内存中的数据 写入到指定的excel表格中! ...

  3. 微信小程序获取用户手机号

    获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...

  4. MongoDB(课时6 关系查询)

    支持关系查询操作:大于($gt),小于($lt),大于等于($gte),小于等于($lte),不等于($ne ),等于(key:value 或 $eq).想让这些操作正常使用,需要准备一个数据集合. ...

  5. Qt5_QString_测试

    ZC: 下面的测试效果看,可以只是用 “QString.isEmpty()” 或者 “QString == ""”来判断 QString是否为 空或者NULL . 1. 1.1. ...

  6. 禁用表单元素 && 禁止选中

    一.禁用表单元素 1.dom设置属性 disabled="disabled" || disabled=true 2.css样式(高版本浏览器) pointer-events:non ...

  7. C++STL2--map

    C++STL2--map 一.心得 本质上就是数组,关联数组,map就是键到值得一个映射,并且重载了[]符号,所以可以像数组一样用. map<string,int> cnt;//前键后值, ...

  8. 新概念 Lesson 4 Are you a teacher

    打招呼用语: Good morning, Good afternoon,Good evening Nice to meet you. How do you do? She is French. 她是法 ...

  9. codeforces 559b//Equivalent Strings// Codeforces Round #313(Div. 1)

    题意:定义了字符串的相等,问两串是否相等. 卡了时间,空间,不能新建字符串,否则会卡. #pragma comment(linker,"/STACK:1024000000,102400000 ...

  10. POJ-3083 Children of the Candy Corn (BFS+DFS)

    Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and mus ...