var splitUpload = (function(){ /** * 分割上传其中一块 * @param {[type]} file [文件Flie对象] * @param {[type]} totalSize [总大小] * @param {[type]} eachSize [每次大小] * @param {[type]} SucCallback [成功回调] * 回调参数 * @param thunkTo [已上传大小] * @param totalSize [总大小] * @param {[type]} ErrCallback [失败回调] * 回调参数 * @param res [ajax回调的response] * @param {[type]} count [上传的次数] * @param {[type]} counts [上传的总次数] * @param {[string]} uploadLink [上传链接] 默认 */ function loop(file, totalSize, eachSize, SucCallback, ErrCallback, count, counts, uploadLink){ var thunkFrom = count * eachSize;// 切割起始端 var thunkTo = (count + 1) * eachSize > totalSize ? totalSize : (count + 1) * eachSize;// 切割末端 fd = new FormData(); fd.append('theFile', file.slice(thunkFrom, thunkTo)); // 分好段的文件 fd.append('fileName', file.name); // 文件名 fd.append('totalSize', totalSize); // 大小 fd.append('isFirstChunk', count === 0); // 是否第一次上传 fd.append('isLastChunk', count === counts - 1); // 是否最后一次上传 var xhr = new XMLHttpRequest(); xhr.open("post", uploadLink, true); xhr.onreadystatechange = function () { if(xhr.readyState==4 && xhr.status==200){ var rs = JSON.parse(xhr.responseText); if(rs.status == 200){ SucCallback(thunkTo, totalSize) // isLastChunk if(count === counts - 1){ return; } // 继续上传 loop(file, totalSize, eachSize, SucCallback, ErrCallback, ++count, counts, uploadLink) }else{ ErrCallback(rs) } } }; xhr.send(fd); } /** * 分割上传 * @param {[type]} file [文件Flie对象] * @param {[function]} SucCallback [成功回调] * @param {[function]} ErrCallback [失败回调] * @param {[string]} uploadLink [上传链接] default */ return function(file, SucCallback, ErrCallback, uploadLink) { uploadLink = uploadLink || '/upload'; var totalSize = file.size; // 总大小 var eachSize = 1024 * 1000; // 每次上传大小 这里是100kb var counts = Math.ceil(totalSize / eachSize); // 上传的总次数 loop(file, totalSize, eachSize, SucCallback, ErrCallback, 0, counts, uploadLink) //test /*size > 1024 ? size / 1024 > 1024 ? size / (1024 * 1024) > 1024 ? (size / (1024 * 1024 * 1024)).toFixed(2) + 'GB' : (size / (1024 * 1024)).toFixed(2) + 'MB' : (size / 1024).toFixed(2) + 'KB' : (size).toFixed(2) + 'B';*/ })();