摘要:思路很簡(jiǎn)單,拿到文件,保存文件唯一性標(biāo)識(shí),切割文件,分段上傳,每次上傳一段,根據(jù)唯一性標(biāo)識(shí)判斷文件上傳進(jìn)度,直到文件的全部片段上傳完畢。
思路很簡(jiǎn)單,拿到文件,保存文件唯一性標(biāo)識(shí),切割文件,分段上傳,每次上傳一段,根據(jù)唯一性標(biāo)識(shí)判斷文件上傳進(jìn)度,直到文件的全部片段上傳完畢。
以下文字沒(méi)有完整的代碼,只有基礎(chǔ)理論,伸手黨繞道。
讀取文件var input = document.querySelector("input"); input.addEventListener("change", function() { var file = this.files[0]; });文件唯一性
var md5code = md5(file);文件切割
var reader = new FileReader(); reader.readAsArrayBuffer(file); reader.addEventListener("load", function(e) { //每10M切割一段,這里只做一個(gè)切割演示,實(shí)際切割需要循環(huán)切割, var slice = e.target.result.slice(0, 10*1024*1024); });h5上傳一個(gè)(一片)文件
var formdata = new FormData(); formdata.append("0", slice); //這里是有一個(gè)坑的,部分設(shè)備無(wú)法獲取文件名稱,和文件類型,這個(gè)在最后給出解決方案 formdata.append("filename", file.filename); var xhr = new XMLHttpRequest(); xhr.addEventListener("load", function() { //xhr.responseText }); xhr.open("POST", ""); xhr.send(formdata); xhr.addEventListener("progress", updateProgress); xhr.upload.addEventListener("progress", updateProgress); function updateProgress(event) { if (event.lengthComputable) { //進(jìn)度條 } }無(wú)法獲取文件類型的設(shè)備解決方案
首先在:http://www.garykessler.net/li...
這里只給出了常見(jiàn)的圖片和視頻的文件類型判斷
function checkFileType(type, file, back) { /** * type png jpg mp4 ... * file input.change=> this.files[0] * back callback(boolean) */ // http://www.garykessler.net/library/file_sigs.html var args = arguments; if (args.length != 3) { back(0); } var type = args[0]; // type = "(png|jpg)" , "png" var file = args[1]; var back = typeof args[2] == "function" ? args[2] : function() {}; if (file.type == "") { // 如果系統(tǒng)無(wú)法獲取文件類型,則讀取二進(jìn)制流,對(duì)二進(jìn)制進(jìn)行解析文件類型 var imgType = [ "ff d8 ff", //jpg "89 50 4e", //png "0 0 0 14 66 74 79 70 69 73 6F 6D", //mp4 "0 0 0 18 66 74 79 70 33 67 70 35", //mp4 "0 0 0 0 66 74 79 70 33 67 70 35", //mp4 "0 0 0 0 66 74 79 70 4D 53 4E 56", //mp4 "0 0 0 0 66 74 79 70 69 73 6F 6D", //mp4 "0 0 0 18 66 74 79 70 6D 70 34 32", //m4v "0 0 0 0 66 74 79 70 6D 70 34 32", //m4v "0 0 0 14 66 74 79 70 71 74 20 20", //mov "0 0 0 0 66 74 79 70 71 74 20 20", //mov "0 0 0 0 6D 6F 6F 76", //mov "4F 67 67 53 0 02", //ogg "1A 45 DF A3", //ogg "52 49 46 46 x x x x 41 56 49 20", //avi (RIFF fileSize fileType LIST)(52 49 46 46,DC 6C 57 09,41 56 49 20,4C 49 53 54) ]; var typeName = [ "jpg", "png", "mp4", "mp4", "mp4", "mp4", "mp4", "m4v", "m4v", "mov", "mov", "mov", "ogg", "ogg", "avi", ]; var sliceSize = /png|jpg|jpeg/.test(type) ? 3 : 12; var reader = new FileReader(); reader.readAsArrayBuffer(file); reader.addEventListener("load", function(e) { var slice = e.target.result.slice(0, sliceSize); reader = null; if (slice && slice.byteLength == sliceSize) { var view = new Uint8Array(slice); var arr = []; view.forEach(function(v) { arr.push(v.toString(16)); }); view = null; var idx = arr.join(" ").indexOf(imgType); if (idx > -1) { back(typeName[idx]); } else { arr = arr.map(function(v) { if (i > 3 && i < 8) { return "x"; } return v; }); var idx = arr.join(" ").indexOf(imgType); if (idx > -1) { back(typeName[idx]); } else { back(false); } } } else { back(false); } }); } else { var type = file.name.match(/.(w+)$/)[1]; back(type); } }
checkFileType("(mov|mp4|avi)",file,function(fileType){ // fileType = mp4, // 如果file的類型不在枚舉之列,則返回false });上面上傳文件的一步,可以改成:
formdata.append("filename", md5code+"."+fileType);
總結(jié):有了切割上傳,有了文件唯一標(biāo)識(shí)信息(文件md5)斷點(diǎn)續(xù)傳只不過(guò)是后臺(tái)的一個(gè)小小的判斷邏輯而已。
未來(lái),前端,大有可為有些小伙伴不是太清楚后臺(tái)的小小的判斷是怎么做的:
這里貼一張圖給大家參考,自己手畫(huà),有點(diǎn)丑,將就下。
后續(xù)我再畫(huà)一張完整的上傳流程圖給更新上來(lái)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/83045.html
摘要:所以,該文適合于全棧工程師,至少是想成為還有,為什么需要分片,不分片能實(shí)現(xiàn)斷點(diǎn)續(xù)傳嗎分片是為了充分利用網(wǎng)絡(luò)帶寬,加快上傳速度不分片也是能夠?qū)崿F(xiàn)斷點(diǎn)續(xù)傳的。詳細(xì)參考文件上傳組件深度剖析分片上傳與斷點(diǎn)續(xù)傳之間沒(méi)有很直接的關(guān)系好了,進(jìn)入正題。 上傳文件,基本上是每一個(gè)網(wǎng)站應(yīng)用都會(huì)具備的一個(gè)功能。對(duì)于一個(gè)網(wǎng)絡(luò)存儲(chǔ)應(yīng)用,對(duì)于上傳功能要求更是迫切。 如今市面上成熟上傳插件,如WebUpload...
摘要:基于的大文件分片上傳我們?cè)谧鑫募蟼鞯臅r(shí)候,如果文件過(guò)大,可能會(huì)導(dǎo)致請(qǐng)求超時(shí)的情況。所以,在遇到需要對(duì)大文件進(jìn)行上傳的時(shí)候,就需要對(duì)文件進(jìn)行分片上傳的操作。所以把文件名稱加上。后續(xù)延伸斷點(diǎn)續(xù)傳多文件多批次上傳 基于Node.js的大文件分片上傳 我們?cè)谧鑫募蟼鞯臅r(shí)候,如果文件過(guò)大,可能會(huì)導(dǎo)致請(qǐng)求超時(shí)的情況。所以,在遇到需要對(duì)大文件進(jìn)行上傳的時(shí)候,就需要對(duì)文件進(jìn)行分片上傳的操作。同時(shí)如...
摘要:基于的大文件分片上傳我們?cè)谧鑫募蟼鞯臅r(shí)候,如果文件過(guò)大,可能會(huì)導(dǎo)致請(qǐng)求超時(shí)的情況。所以,在遇到需要對(duì)大文件進(jìn)行上傳的時(shí)候,就需要對(duì)文件進(jìn)行分片上傳的操作。所以把文件名稱加上。后續(xù)延伸斷點(diǎn)續(xù)傳多文件多批次上傳 基于Node.js的大文件分片上傳 我們?cè)谧鑫募蟼鞯臅r(shí)候,如果文件過(guò)大,可能會(huì)導(dǎo)致請(qǐng)求超時(shí)的情況。所以,在遇到需要對(duì)大文件進(jìn)行上傳的時(shí)候,就需要對(duì)文件進(jìn)行分片上傳的操作。同時(shí)如...
摘要:基于的大文件分片上傳我們?cè)谧鑫募蟼鞯臅r(shí)候,如果文件過(guò)大,可能會(huì)導(dǎo)致請(qǐng)求超時(shí)的情況。所以,在遇到需要對(duì)大文件進(jìn)行上傳的時(shí)候,就需要對(duì)文件進(jìn)行分片上傳的操作。所以把文件名稱加上。后續(xù)延伸斷點(diǎn)續(xù)傳多文件多批次上傳 基于Node.js的大文件分片上傳 我們?cè)谧鑫募蟼鞯臅r(shí)候,如果文件過(guò)大,可能會(huì)導(dǎo)致請(qǐng)求超時(shí)的情況。所以,在遇到需要對(duì)大文件進(jìn)行上傳的時(shí)候,就需要對(duì)文件進(jìn)行分片上傳的操作。同時(shí)如...
摘要:基于的大文件分片上傳我們?cè)谧鑫募蟼鞯臅r(shí)候,如果文件過(guò)大,可能會(huì)導(dǎo)致請(qǐng)求超時(shí)的情況。所以,在遇到需要對(duì)大文件進(jìn)行上傳的時(shí)候,就需要對(duì)文件進(jìn)行分片上傳的操作。所以把文件名稱加上。方便后續(xù)文件合并。 基于Node.js的大文件分片上傳 我們?cè)谧鑫募蟼鞯臅r(shí)候,如果文件過(guò)大,可能會(huì)導(dǎo)致請(qǐng)求超時(shí)的情況。所以,在遇到需要對(duì)大文件進(jìn)行上傳的時(shí)候,就需要對(duì)文件進(jìn)行分片上傳的操作。同時(shí)如果文件過(guò)大,在...
閱讀 3626·2021-11-24 09:39
閱讀 2563·2021-11-15 11:37
閱讀 2220·2021-11-11 16:55
閱讀 5222·2021-10-14 09:43
閱讀 3714·2021-10-08 10:05
閱讀 3016·2021-09-13 10:26
閱讀 2334·2021-09-08 09:35
閱讀 3546·2019-08-30 15:55