簡體   English   中英

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屬性中

當我完成所有塊的上傳后,服務器的API會抱怨文件上傳不完整。 為了測試此方法,我將串聯的二進制字符串轉換為Blob,然后將Chrome保存到我的下載文件夾中,結果發現我的媒體播放器說該文件無法播放。

我已經閱讀了該網站上的帖子和其他文章這些文章建議將整數表示的二進制數據直接轉換為字符串會導致數據丟失,並且建議將其轉換為base64編碼的字符串,因為Javascript沒有像C#一樣的StreamContent對象。

問題是,即使我將Content-Transfer-Encodingbase64我也不認為API(不是我們編寫的)會使用它,並且無法告訴您需要base64解碼。

我的問題是:這是通過AJAX調用安全發送視頻數據的唯一可行的方法嗎? 如果沒有,我該如何在我的AJAX請求的數據字段中發送它? 互聯網上可能有成千上萬的這樣的上傳者,但是我找不到任何有關如何執行此操作的可靠文檔。 如果事實證明服務器需要使用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);
      }
    });

  }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM