前端大檔案斷點上傳

2022-06-16 15:03:12 字數 2648 閱讀 2697

大致原理就是將大檔案分割成好幾個部分(根據固定數量/固定大小方式),每個切片都有自己的資料和各自的名字,每一部分都發起一次ajax請求,將切片傳遞到伺服器端。伺服器端根據檔案建立乙個資料夾,用來存放大檔案的切片,當客戶端將全部切片傳遞到伺服器端的時候,再發起一次請求告知伺服器端,前端將資料全部傳遞完成了,伺服器端接收到傳遞完成的通知的時候,將剛剛資料夾裡面的檔案全部合併成乙個檔案,最後將該資料夾刪除。簡短概括:大檔案-->拆成很多小檔案-->發起很多ajax請求傳送小檔案-->伺服器端接收小檔案-->組裝成大檔案

...

//根據檔案內容生成唯一的hash

import sparkmd5 from "spark-md5";

...//

開始上傳

async confirmupload () ;

const filebuffer = await this.fileparse(currentfile, 'buffer');

let spark = new

sparkmd5.arraybuffer();

const hash =spark.end();

const suffix = /\.([0-9a-za-z]+)$/i.exec(currentfile.name)[1];

//將檔案切割為100份來上傳

let partlist =;

const partsize = currentfile.size / 100;

let cur = 0;

for (let i = 0; i < 100; i++) _$.$`,

}cur +=partsize;

partlist.push(item);

} this.partlist =partlist;

this.hash =hash;

//傳送ajax請求到伺服器端

this

.sendrequest();

},

根據檔案切片發起ajax請求

async sendrequest () 

this.partlist.foreach((item, index) =>).then(res =>})}

requestlist.push(fn);

});let currentindex = 0;

const send = async () =>

await requestlist[currentindex]();

currentindex++;

send();

} send();

},

全部切片上傳完成後通知後端上傳完成

//

檔案上傳,需要後端合併檔案

complete ()

}).then(res =>)

},

模擬暫停與開始

//

暫停和開始

handlebtn ()

//暫停上傳

this.btn = true;

this.abort = true

;}

接收檔案切片

//

切片上傳

const = await handlemultiparty(req, res, true

); const [chunk] =files.chunk;

const [filename] =fields.filename;

//獲取上傳檔案的hash

const hash = /([0-9a-za-z]+)_\d+/.exec(filename)[1];

const dir = `$/$`;

if (!fs.existssync(dir))

const path = `$/$`;

fs.access(path, async err =>`)

}) }

//測試上傳需要時間,手動延遲

await new promise(resolve =>, 100);

});//不存在的時候就建立

const readstream =fs.createreadstream(chunk.path);

const writestream =fs.createwritestream(path);

readstream.pipe(writestream);

readstream.on('end', function

() `)

}); })

})});

合併多個切片檔案

//

大檔案上傳後

const =req.query;

const path = `$/$`;

const filelist =fs.readdirsync(path);

let suffix = null

; filelist.sort((a, b) =>).foreach(item =>/$`);

}); fs.rmdirsync(path);

res.send(/upload/$.$`

});})

SpringCloud大檔案分片斷點上傳實現原理

1背景 使用者本地有乙份txt或者csv檔案,無論是從業務資料庫匯出 還是其他途徑獲取,當需要使用螞蟻的大資料分析工具進行資料加工 挖掘和共創應用的時候,首先要將本地檔案上傳至odps,普通的小檔案通過瀏覽器上傳至伺服器,做一層中轉便可以實現,但當這份檔案非常大到了10gb級別,我們就需要思考另一種...

web直傳oss之大檔案上傳,切片上傳,斷點續傳

本人菜鳥乙個,大神輕噴。偶感瓶頸與今日起開始記錄平時專案中的難題以及平時的心得。最近專案中剛好有讓前端單獨直接接入阿里的sdk實現web直傳oss的功能。廢話不多說直接官方文件看一下,彌補一下我的未知世界,發現文件還是比較好理解的。這裡貼下官網的 片段 我按照我這邊專案走的流程 第一步 首先從後端獲...

上傳大檔案 關於大檔案上傳

js計算檔案md5使用spark md5.js,據說這個庫使用的是世界上最快的md5演算法。js對檔案切片並使用ajax上傳切片 let size file.size 獲取檔案大小 const shardsize 1024 1024 塊大小1mb let shardcount math.ceil s...