2012-11-26 77 views
0

我寫了一些AJAX獲取文件客戶端,以便我可以將其發回服務器。反對意見被取爲ArrayBuffer。但是,將這個二進制文件發回服務器進行保存時,我需要在該文件中包含一些元數據。我試過用其他字符串和對象包裝ArrayBuffer,但是當我檢查數據服務器端時,它似乎只傳輸了ArrayBuffer的長度。POSTing一個ArrayBuffer包裹在一個對象內

我試圖通過這個答案轉換ArrayBuffer字符串:

https://stackoverflow.com/a/11058858/449511

但是,我ArrayBuffer的bytelength是519843,這導致例外:

Uncaught RangeError: ArrayBuffer length minus the byteOffset is not a multiple of the element size.

我的理解ArrayBuffers是稀疏的,我看過MDN文檔,但無法找到其他東西。我很感激任何進一步的資源或想法,我可以如何將此ArrayBuffer轉換爲字符串或將我的ArrayBuffer轉換爲對象。

這裏是我的AJAX代碼片段:

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost:5000/', 
    data: {fname: f, url:u, binary:b}, // the binary is an ArrayBuffer 
}); 
+0

您是否嘗試過使用'UInt8Array'而不是'UInt16Array'? –

+0

我其實只是試過,而且工作。爲什麼是這樣?我的印象是,長度不能被8或16整除,所以這些是錯誤的寬度陣列試圖將它們投入。 – user449511

+0

8 = 8位= 1字節 –

回答

0

正是如此它的記錄,由於@Markus中的註釋。使用UInt8Array的作品。我也剛剛發現這個問題,以準確記錄我需要的:Getting BLOB data from XHR request

使用ArrayBuffer在我的問題中鏈接的字符串答案不適用於大文件大小,所以我寫了一個迭代版本並在發佈到對象之前轉換爲base64。

var binary_string = '' 
bytes = new Uint8Array(ArrayBuffer object from ajax get); 
for (var i = 0; i < bytes.byteLength; i++) { 
    binary_string += String.fromCharCode(bytes[i]); 
} 
base64_string = window.btoa(binary_string);