大致原理就是將大檔案分割成好幾個部分(根據固定數量/固定大小方式),每個切片都有自己的資料和各自的名字,每一部分都發起一次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...