// 有时候服务器无法返回我们需要的数据类型, 但客户端不知道服务器无法返回, 所以就算xhr.responseType设置了想拿的数据类型, 但也拿不到, 而且xhr.response使用xhr.responseType设置的值来解析一个非xhr.responseType类型的值, 此时就会发生问题.overrideMimeType替代responseType
const uploadFile =(file,size) => {
//每片1M大小
var chunkSize = 1024 * 1024 * size;
//文件大小
var totalSize = file.size;
//分片总数
var chunkQuantity = Math.ceil(totalSize / chunkSize);
//偏移量
var offset = 0;
var reader = new FileReader();
reader.onload = function (e) {
var xhr = new XMLHttpRequest();
xhr.open("POST", url);
xhr.overrideMimeType("application/octet-stream");
xhr.onreadstatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
++offset;
if (offset === chunkQuantity) {
alerrt("上传完成");
} else if (offset === chunckQuantity - 1) {
blob = file.slice(offset * chunkSize, totalSize);
// 再次读取文件触发onload事件
reader.readAsBinaryString(blob);
} else {
blob = file.slice(offset * chunkSize, (offset + 1) * chunckSize);
// 再次读取文件触发onload事件
reader.readAsBinaryString(blob);
}
} else {
alert("上传出错");
}
}
// 避免sendAsBinary不存在导致报错
if (!xhr.prototype.sendAsBinary) {
xhr.prototype.sendAsBinary = function (datastr) {
function byteValue(x) { return x.charCodeAt(0) & 0xff; }
var ords = Array.prototype.map.call(datastr, byteValue);
var ui8a = new Uint8Array(ords);
this.send(ui8a.buffer);
}
}
}
var blob = file.slice(0, chunkSize);reader.readAsBinaryString(blob);
}