// 有时候服务器无法返回我们需要的数据类型, 但客户端不知道服务器无法返回, 所以就算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);
}复制代码