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

  2. 词云wordcloud类介绍&python制作词云图&词云图乱码问题等小坑

    词云图,大家一定见过,大数据时代大家经常见,我们今天就来用python的第三方库wordcloud,来制作一个大数据词云图,同时会降到这个过程中遇到的各种坑, 举个例子,下面是我从自己的微信上抓的微信 ...

  3. React Native基础概念和基础认识

    学习地址:https://github.com/vczero/react-native-lesson 当我们初始化一个RN项目的时候主要的是index.ios.js文件和index.android.j ...

  4. Java中的RTTI

    RTTI可以帮助我们在运行时识别对象和类的信息. 一般传统的RTTI有三种实现方式: 1. 向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父类转成子 ...

  5. 浅谈PHP5中垃圾回收算法

    原文链接:http://www.cnblogs.com/leoo2sk/archive/2011/02/27/php-gc.html PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源 ...

  6. ubuntu16.04上安装tomcat7

    sudo apt-get update sudo apt-get install tomcat7 启动:sudo service tomcat7 start 访问http://127.0.0.1:80 ...

  7. Excel表格的导入导出

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

  8. mount: unknown filesystem type 'LVM2_member'解决方案【转】

    一台服务器,普通/dev/sda1/2(硬盘一) 同步数据到 lvm_member(硬盘二) rsync两硬盘数据同步: From: http://hi.baidu.com/williwill/ite ...

  9. 『Python』pycharm常用设置

    学习一下pycharm的快捷操作,提升速度,也提升舒适度,笑. 常用快捷键 ctrl + d :复制粘贴本行到下一行 ctrl + y :删除本行 ctrl + 鼠标点击 :跳转 ctrl + / : ...

  10. ECharts学习(1)--toolbox(工具栏)

    1. toolbox:这是ECharts中的工具栏.内置有导出图片.数据视图.动态类型切换.数据区域缩放.重置五个工具. 2. toolbox中的属性,不包含五个工具.里面最主要的就是feature这 ...