Предоставляет ли 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;
};