Предоставляет ли jQuery $.ajax или $.load аргумент responseType arrayBuffer?

Я начинаю работу с API веб-аудио и просто задаюсь вопросом, можно ли использовать функции jQuery $.ajax или $.load, чтобы XMLHttpRequest получал аудиоданные. Предоставить ответ $.ajax или $.load responseType = arrayBuffer?

EDIT:

Итак, вот что я до сих пор:

function loadAudio() {
    $.ajax({
            url: sourceUrl
        }).done(function(response){
            return response;
        })
    }

но мне нужно вернуть ArrayBuffer. Итак, как мне преобразовать ответ в ArrayBuffer?

Ответы

Ответ 1

О вашем вопросе, похоже, jQuery еще не поддерживает его. Прежде чем использовать его, как я предложил ниже, попробуйте проверить, доступна ли эта функция.

С помощью XHTMLRequest вы можете обмануть свой сервер и получить двоичную строку, представляющую нужные вам байты с сервера. Он отлично работает.

var xhr = new XMLHttpRequest();
xhr.open('GET', '/your/audio/file.wav', true);

// Here is the hack
xhr.overrideMimeType('text/plain; charset=x-user-defined');

xhr.onreadystatechange = function(event) {
  if ( this.readyState == 4 && this.status == 200 ) {
    var binaryString = this.responseText;

    for (var i = 0, len = binaryString.length; i < len; ++i) {
      var c = binaryString.charCodeAt(i);
      var byte = c & 0xff; //it gives you the byte at i
      //Do your cool stuff...

    }
  }
};

xhr.send();

Он работает, он распространен... но... это все еще хак.

С помощью XHTML Request Level 2 вы можете указать responseType как "arraybuffer" и фактически получить ArrayBuffer. Это намного приятнее. Проблема заключается в том, чтобы проверить, поддерживает ли ваш браузер эту функцию.

var xhr = new XMLHttpRequest();
xhr.open('GET', '/your/audio/file.wav', true);
xhr.responseType = 'arraybuffer';

xhr.onload = function(e) {
  if (this.status == 200) {
    //Do your stuff here
  }
};

xhr.send();

Надеюсь, я помог.

Ответ 2

я извлек данные из сервера в виде строки (которая кодируется base64 в строку) с помощью ajax get json, а затем на стороне клиента я расшифровала ее на base64 и затем на буфер массива.

Пример кода

function solution1(base64Data) {

var arrBuffer = base64ToArrayBuffer(base64Data);

// It is necessary to create a new blob object with mime-type explicitly set
// otherwise only Chrome works like it should
var newBlob = new Blob([arrBuffer], { type: "application/pdf" });

// IE doesn't allow using a blob object directly as link href
// instead it is necessary to use msSaveOrOpenBlob
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    window.navigator.msSaveOrOpenBlob(newBlob);
    return;
}

// For other browsers: 
// Create a link pointing to the ObjectURL containing the blob.
var data = window.URL.createObjectURL(newBlob);

var link = document.createElement('a');
document.body.appendChild(link); //required in FF, optional for Chrome
link.href = data;
link.download = "file.pdf";
link.click();
window.URL.revokeObjectURL(data);
link.remove();

}

function base64ToArrayBuffer(data) {
var binaryString = window.atob(data);
var binaryLen = binaryString.length;
var bytes = new Uint8Array(binaryLen);
for (var i = 0; i < binaryLen; i++) {
    var ascii = binaryString.charCodeAt(i);
    bytes[i] = ascii;
}
return bytes;

};