nwjs 实现的 分块上传
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 实现的 分块上传的更多相关文章
- PHP搭建大文件切割分块上传功能
背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...
- HTML5+AJAX原生分块上传文件的关键参数设置
processData:false 这是jquery.ajax的一个参数.默认值为true,表示会将非字符串对象自动变成k1=v1&k2=v2的形式,例如一个数组参数{d:[1,2]},到服务 ...
- Aliyun OSS SDK 异步分块上传导致应用异常退出
问题描述: 使用Aliyun OSS SDK的BeginUploadPart/EndUploadPart执行异步分块上传操作,程序出现错误并异常退出! 原因分析: Using .NET Framewo ...
- 使用HTML5 FormData对象实现大文件分块上传(断点上传)功能
FormData是HTML5新增的一个对象,通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对.它可以更灵活方便的发送表单数据,因为可以独立于表单使用.如果你把表单 ...
- Azure Storage 分块上传
概述 Azure 存储提供三种类型的 Blob:块 Blob.页 Blob 和追加 Blob.其中,块 Blob 特别适用于存储短的文本或二进制文件,例如文档和媒体文件. 块 Blob 由块组成,每个 ...
- net core分块上传文件
net core分块上传文件 写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...( ...
- 前端js怎么实现大文件G级的断点续传(分块上传)和分段下载
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
- 一、.Net Core 分块上传文件
一..Net Core 分块上传文件 一.前端实现 @* For more information on enabling MVC for empty projects, visit http://g ...
- springboot集成websocket实现大文件分块上传
遇到一个上传文件的问题,老大说使用http太慢了,因为http包含大量的请求头,刚好项目本身又集成了websocket,想着就用websocket来做文件上传. 相关技术 springboot web ...
随机推荐
- python tar 压缩解压
压缩: 1. import tarfile import os def tar(fname): t = tarfile.open(fname + ".tar.gz", " ...
- Java 中时间处理 System.currentTimeMillis()
import org.testng.annotations.Test;import java.text.ParseException;import java.text.SimpleDateFormat ...
- 简单介绍tomcat中maxThreads,acceptCount,connectionTimeout
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOW ...
- 【Python】给图片添加水印的Python及Golang实现
前言 不知道大家有没有这样的习惯,一篇比较得意的博客在发表一段时间之后会特别关注,前段时间一篇写到凌晨的博客被 码迷 这个网关爬取之后发表了,因为搜索引擎先爬取码迷的,所以我的博客无法被搜索到,即使直 ...
- Angular2,Springboot,Zuul,Shiro跨域CORS请求踩坑实录
前言:前后端分离,业务分离,网关路由等已经成为当下web application开发的流行趋势.前端以单页面路由为核心的框架为主体,可以单独部署在nodejs或nginx上.后端以springboot ...
- jsonp跨域远离
http://blog.csdn.net/sky_beyond/article/details/54096275 function ajax( obj ){ // 默认参数 由于 jsonp 原理是 ...
- Oracle数据库system用户忘记了密码怎么办
1.在运行里面输入cmd调出dos窗口,然后在dos窗口中输入sqlplus /nolog 如:D:\oracle\ora92\bin>sqlplus /nolog 2.输入连接命令 如:SQL ...
- 雷林鹏分享:C# 正则表达式
C# 正则表达式 正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 定义正则表达式 下面列出了用于定义正则表达式的各种类 ...
- [.NET源码] EF的增删改查
EF的增删改查 创建上下文对象:WordBoradEntities db = new WordBoradEntities(); 一.添加: //1.1创建实体对象 User uObj = new Us ...
- 20170706wdVBA保存图片到本地API
Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Pri ...