亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

斷點續傳問題

斷點續傳問題

慕工程0101907 2019-03-12 14:15:04
我的需求簡單描述為: 對于大文件按照一定的chunkSize大小切分為許多小文件上傳存儲在mongodb中, 下載時通過node.js發起n(n為切分的小文件的個數)個下載請求,每個請求請求 一部分數據,最后通過writeStream寫入到同一個文件中。系統的整體流程描述如上?,F在要做的工作是: 上述的功能已經完成,現在要做的是下載過程中的斷點續傳問題,即就是下載時如何 本地文件中已有該部分數據則跳過該部分的下載。遇到的問題:現在的問題是,如何用簡單的方法判斷文件中的某一個部分是否已經存在(我想簡單的通過判斷某一塊的第一個<0>和最后一個<chunkSize-1>處的文件描述符是否有內容來判斷此塊是否已經下載完成),請問各位碼友Node.js中的文件描述符fd是否已有像C語言中的seek方法(文件描述符移動到指定的位置),移動到指定位置后怎么判斷此處是否有內容。謝謝各位碼友。下載部分的代碼如下(其中downloadpromise是我自己封裝的用來下載每一塊數據的Promise): function download(filedata,username,chunkSize) { var chunks_n = Math.ceil(filedata.length/filedata.chunkSize); var file_id = filedata._id; var DLpromiseall = []; //創建對應的文件,為以后createWrite而使用 fs.open(filedata.filename, "a", (err, fs) => {     if (err) {         console.log(err);     } })  for(let curindex = 0;curindex < chunks_n;curindex++) {     DLpromiseall.push(downloadpromise(username,file_id,curindex,filedata.filename,chunkSize)); } var mytimer = setInterval(() => {     if(DLpromiseall.length == chunks_n) {         clearInterval(mytimer);         Promise.all(DLpromiseall).then(vales=>{             console.log(vales);             console.log("all download")         }).catch(err =>{             console.log(err);             console.log("下載失敗");         })     } },500)}downloadPromise函數如下:
查看完整描述

2 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

上述的功能已經完成,現在要做的是下載過程中的斷點續傳問題,即就是下載時如何
本地文件中已有該部分數據則跳過該部分的下載。

在原有的http協議,客戶端會通過Range請求服務器要返回的部分內容(先判斷本地已經下載了幾個字節),服務端通過Content-Range告知客戶端目前返回下來的部分內容。而你這里多出來的一部只是分塊而已,都是一樣的。

通過option.start指定文件流開始的位置。

fs.createReadStream(filePath, {

     start: startRange,

     end : endRange //如果需要

});


查看完整回答
反對 回復 2019-03-30
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

暫時想到了一個不是很成熟的想法,通過判斷每一塊里面是否有寫入的內容,以及寫入的內容是否達到規定寫入的標準。代碼如下


function readPromise(filepath,i,options) {

    return new Promise(function (resolve,reject) {

        let flag = false;

        let readStream = fs.createReadStream(filepath,options);

        readStream.on("data",(chunk)=>{

            let chunString = chunk.toString().trim();

            let nsize = options.end - options.start + 1;

            if(!chunString||chunString.length < nsize) {

                flag = true;

            }

        })

        readStream.on("close",(ele) => {

            resolve(flag);

        })

        readStream.on("error",(e) => {

            reject(e);

        })

    })

}


查看完整回答
反對 回復 2019-03-30
  • 2 回答
  • 0 關注
  • 420 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號