SlimeSpace

nodejs_http 下载相关

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");
    });
}
  1. 快人快语的女孩说道:

  2. 史莱姆说道:

    test

发表评论 取消回复

电子邮件地址不会被公开。 必填项已用*标注