function downloadfile(item){
// 1. 检查存储路径是否存在
index = item.index;
let path_save = path.join(item.path, item.name + ".stdownload");
console.log("存储路径:",path_save);
// 2. 检查文件状态(已经传输完毕\传输一部分\错误内容)
checkfileStat(item,path_save);
// 3. 建立request连接
if(item.stat != "downloading"){
return;
}
let option = {
hostname: item.hostname,
port: parseInt( item.port ),
path: item.url,
method: 'GET',
headers: {
'Range': 'bytes=' + item.filesize + '-'
},
};
let req = http.get( option, function( response ) {
console.log("任务创建Code",response.statusCode);
global.downloadingReq[item.index] = response;
global.downloadingReq[item.index].item = req.item;
// code判断
req.item.statusCode = response.statusCode;
if(parseInt(response.statusCode / 100) != 2){
req.item.endtime = Date.now();
req.item.stat = "error";
req.item.log = "statusCode [" + response.statusCode + "]";
console.log("error:",req.item.log);
try{
fs.closeSync(req.item.fd);
} catch (err) {
}
req.destroy();
if(global.downloadingReq[req.item.index] != undefined) {
delete global.downloadingReq[req.item.index];
}
return;
}
response.on('data', (chunk) => {
if(req.item.stat != "downloading") {
console.log(req.item.index,req.item.name,"终止下载");
try{
fs.closeSync(req.item.fd);
} catch (err) {
//console.log(err);
}
req.destroy();
if(global.downloadingReq[req.item.index] != undefined) {
delete global.downloadingReq[req.item.index];
}
return;
}
// 写入数据
try {
fs.appendFileSync(req.item.fd, chunk);
} catch (err) {
req.item.endtime = Date.now();
req.item.stat = "error";
req.item.log = err;
console.log("error:",req.item.log);
req.destroy();
if(global.downloadingReq[req.item.index] != undefined) {
delete global.downloadingReq[req.item.index];
}
return;
}
// 文件大小
req.item.filesize += chunk.length;
global.downDataSec += chunk.length;
if(stopAllmission == false) {
if(global.setSpeedSec > global.setSpeedSecReal) {
// 以硬限速为上限
if(global.downDataSec > global.setSpeedSecReal) {
stopAllmission = true;
}
} else {
if(global.downDataSec > global.setSpeedSec) {
stopAllmission = true;
}
}
}
if(stopAllmission == true) {
console.log(req.item.index,"已经暂停");
response.pause();
}
});
response.on('end', () => {
if(req.item.stat != "downloading"){
if(global.downloadingReq[req.item.index] != undefined) {
delete global.downloadingReq[req.item.index];
}
return;
}
// 1. 文件重命名
try{
fs.closeSync(req.item.fd);
} catch (err) {}
downname = path.join(req.item.path, req.item.name + ".stdownload");
filename = path.join(req.item.path, req.item.name);
fs.renameSync(downname,filename);
// 2. 转移任务到finish列表
let arrindex = global.listdownload.getindex(req.item.index);
global.listdownload.splice(arrindex,1);
// 3. 改变状态
req.item.endtime = Date.now();
req.item.stat = "finish";
addfinishlist(item);
console.log(req.item.name, "下载完毕2!");
if(global.downloadingReq[req.item.index] != undefined) {
delete global.downloadingReq[req.item.index];
}
});
});
req.on('error', function(err) {
console.log(err);
if(req.item.stat != "downloading"){
return;
}
req.item.log = err;
try{
fs.closeSync(req.item.fd);
} catch (err) {
}
if(global.downloadingReq[req.item.index] != undefined) {
delete global.downloadingReq[req.item.index];
}
});
req.item = item;
}
function checkfileStat(item,path_save) {
if(fs.existsSync(path_save)) {
let stats = fs.statSync(path_save);
if(item.totalsize == stats.size) {
try{
fs.closeSync(item.fd);
} catch (err) {
item.stat = "error";
item.log = err;
item.endtime = Date.now();
}
let downname = path.join(item.path, item.name + ".stdownload");
let filename = path.join(item.path, item.name);
try{
fs.renameSync(downname,filename);
} catch (err) {
item.stat = "error";
item.log = err;
item.endtime = Date.now();
}
// 2. 转移任务到finish列表
let arrindex = global.listdownload.getindex(item.index);
global.listdownload.splice(arrindex,1);
// 3. 改变状态
item.endtime = Date.now();
item.stat = "finish";
addfinishlist(item);
console.log(item.name, "下载完毕4!");
return;
}
else {
item.filesize = stats.size;
if(item.totalsize < item.filesize){
// 当地文件已经大于远端,重新写入文件
try {
fd = fs.openSync(path_save, 'w');
item.fd = fd;
} catch (err) {
item.endtime = Date.now();
item.stat = "error";
item.log = "本地文件与远端不符";
}
}
else if(item.totalsize > item.filesize) {
// 校验结尾是否正确(暂时不做)
try {
fd = fs.openSync(path_save, 'a');
item.fd = fd;
} catch (err) {
item.endtime = Date.now();
item.stat = "error";
item.log = err;
}
}
}
}
else {
// 文件不存在,建立新的文件传输
try {
fd = fs.openSync(path_save, 'w');
item.fd = fd;
} catch (err) {
console.log(err);
item.endtime = Date.now();
item.stat = "error";
item.log = err;
}
}
// 下载空文件
console.log("下载空文件",item.totalsize);
if(item.totalsize == 0) {
console.log("下载空文件");
try{
fs.closeSync(item.fd);
} catch (err) {
console.log(err);
item.endtime = Date.now();
item.stat = "error";
item.log = err;
}
let downname = path.join(item.path, item.name + ".stdownload");
let filename = path.join(item.path, item.name);
try{
fs.renameSync(downname,filename);
} catch (err) {
console.log(err);
}
// 2. 转移任务到finish列表
let arrindex = global.listdownload.getindex(item.index);
global.listdownload.splice(arrindex,1);
// 3. 改变状态
item.endtime = Date.now();
item.stat = "finish";
addfinishlist(item);
console.log(item.name, "下载完毕3!");
}
}
downloadStorageapp = function(fileUrl){
let option = {
headers: {
'Range': 'bytes='
},
};
req = http.get( fileUrl,option, function( response ) {
console.log("任务创建Code",response.statusCode);
if(response.headers == undefined) {
return;
}
if(response.headers['content-length'] == undefined) {
return;
}
// 获取totalsize
let storageTotalsize = parseInt(response.headers['content-length']);
//初始化当前文件大小
let storageFilesize = 0;
let uniquePath = path.join(os.tmpdir(),uniqueid);
console.log(uniquePath);
if(!fs.existsSync(uniquePath)) {
mkdirsSync(uniquePath);
}
var filedata = "";
response.setEncoding("binary");// 一定要设置response的编码为binary否则会下载下来的文件损毁
if(parseInt(response.statusCode / 100) != 2){
console.log("error:",response.statusCode);
//发送下载更新出错接口
global.loginwindow.webContents.send('message', "downloadUpdateFailure");
return;
}
response.on('data', (chunk) => {
// 写入数据
try {
filedata+=chunk;
storageFilesize += chunk.length;
global.loginwindow.webContents.send('downloadProgress', (storageFilesize/storageTotalsize)*100);
} catch (err) {
console.log("error:",err);
return;
}
});
response.on('end', () => {
try{
fs.writeFileSync(storageTmpZip,filedata,'binary');
// 下载完毕,开始更新
global.loginwindow.webContents.send('message', "update-downloaded-finish");
replaceApp(storageTmpdir);
} catch (err) {
}
});
});
req.on('error', function(err) {
console.log(err);
if(global.loginwindow == undefined){
return;
}
if(global.loginwindow.isDestroyed()){
return;
}
//发送检查更新出错接口
global.loginwindow.webContents.send('message', "checkFailure");
});
}
哇
test