Javascript: 将 Uint8Array 中的二进制数据转换为字符串损坏文件

Javascript: converting binary data in Uint8Array to string corrupting file

我正在尝试通过标准 jQuery $.ajax 调用将视频文件分块上传到服务器。过程很简单:

  1. 在文件对象上使用slice()方法读取块
  2. 使用FileReader.readAsArrayBuffer读取生成的blob
  3. 在 FileReader.onload 回调中创建该结果的 Uint8Array
  4. String.fromCharCode.apply(null, intArrayName)转换成二进制字符串
  5. 在 AJAX 调用的 data 属性
  6. 中将该二进制字符串作为一个块上传

当我完成所有块的上传时,服务器的 API 抱怨文件上传不完整。为测试此方法,我将连接的二进制字符串转换为 Blob,并Chrome 将其保存到我的下载文件夹,却发现我的媒体播放器说该文件无法播放。

我看了本站的帖子,other articles建议将整数表示的二进制数据直接转换为字符串会导致数据丢失,建议转换为base64编码的字符串,因为 Javascript 没有像 C# 那样的 StreamContent 对象。

问题是,即使我将 Content-Transfer-Encoding 设置为 base64,我也不认为 API(不是我们编写的)接受它并且可以告诉需要base64解码。

我的问题是:这是通过 AJAX 调用安全发送视频数据的唯一可靠方法吗?如果没有,我还能如何在我的 AJAX 请求的数据字段中发送它? Internet 上可能有成千上万的上传者,但我找不到有关如何执行此操作的可靠文档。如果事实证明服务器需要 base64 编码,我们可能必须编写一个中间人 API 来为我们进行解码。

多亏了 Patrick Evans,事实证明我需要做的就是上传 blob 本身:

function upload(file) {
  var offset = 0; // what's been sent already
  var fileSize = file.size;
  var chunkSize = 64 * 1024; // bytes

  while (offset < fileSize) {
    var blob = file.slice(offset, chunkSize + offset);

    var urlToUse = ((offset + blob.size) >= fileSize) ? videoFinishBaseUrl : videoContinueBaseUrl;

    $.ajax({
      url: urlToUse,
      method: 'POST',
      data: blob,
      headers: requestHeaders,
      contentType: false,
      processData: false,
      cache: false,
      async: false,
      success: function(data) {
        jQuery('#uploadmsg').text('Finished offset ' + offset);
        offset += blob.size;
      },
      error: function(err) {
        jQuery('#uploadmsg').text(err);
      }
    });

  }
};