Подтвердить что ты не робот

Как разобрать в base64 строку двоичное изображение из ответа?

Я хочу проанализировать запрошенное изображение из моего REST API в строку base64.

enter image description here

Во-первых... Я думал, было бы просто, просто использовать функцию window.btoa() для этой цели.

Когда я пытаюсь сделать это в такой части моего приложения:

.done( function( response, position ) {
    var texture = new Image();
    texture.src = "data:image/png;base64," + window.btoa( response ); 

У меня есть следующая ошибка: Uncaught InvalidCharacterError: не удалось выполнить 'btoa' в 'Window': строка, которая должна быть закодирована, содержит символы за пределами диапазона Latin1.

Как я читал здесь: javascript atob возвращает "String содержит недопустимый символ"

Проблема возникает из-за newlines in the response и почему window.btoa() не удалось. Любой формат двоичного изображения, конечно, будет иметь новые строки... Но поскольку из ссылки выше предложение было удалить/заменить эти символы - это плохое предложение для меня, потому что, если удалить или заменить некоторые символы из двоичного образа, это будет просто поврежден.

Конечно, возможные альтернативы относятся к дизайну API:  - добавить некоторую функцию, возвращающую представление base64  - добавить некоторую функцию, возвращающую url к изображению

Если я не буду его исправлять, я верну свое представление base64 с сервера, но мне не нравится такой способ.

Существует ли какой-то способ решить мою проблему с обработкой двоичного изображения из ответа, как показано выше в части скриншота, не так ли?

4b9b3361

Ответ 1

Я думаю, что часть проблемы, которую вы нажимаете, заключается в том, что jQuery.ajax делает not изначально поддерживает типы blob/arraybuffer XHR2, которые могут прекрасно обрабатывать двоичные данные (см. Чтение двоичных файлов с помощью jQuery.ajax).

Если вы используете собственный объект XHR с xhr.responseType = 'arraybuffer', тогда прочитайте массив ответов и преобразуйте его в Base64, вы получите то, что хотите.

Вот решение, которое работает для меня:

// http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
function fetchBlob(uri, callback) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', uri, true);
  xhr.responseType = 'arraybuffer';

  xhr.onload = function(e) {
    if (this.status == 200) {
      var blob = this.response;
      if (callback) {
        callback(blob);
      }
    }
  };
  xhr.send();
};

fetchBlob('https://i.imgur.com/uUGeiSFb.jpg', function(blob) {
  // Array buffer to Base64:
  var str = btoa(String.fromCharCode.apply(null, new Uint8Array(blob)));

  console.log(str);
  // Or: '<img src="data:image/jpeg;base64,' + str + '">'
});

Ответ 2

вместо того, чтобы перебирать blob с помощью _arrayBufferToBase64(), используйте apply() для преобразования, он в 30 раз быстрее в моем браузере и более лаконичен

// http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
function fetchBlob(uri, callback) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', uri, true);
  xhr.responseType = 'arraybuffer';

  xhr.onload = function(e) {
    if (this.status == 200) {
      var blob = this.response;
      if (callback) {
        callback(blob);
      }
    }
  };
  xhr.send();
};

fetchBlob('https://i.imgur.com/uUGeiSFb.jpg', function(blob) {
  var str = String.fromCharCode.apply(null, new Uint8Array(blob));
  console.log(str);
  // the base64 data: image is then
  // '<img src="data:image/jpeg;base64,' + btoa(str) + '" />'	
});

Ответ 3

Я предполагаю использовать escape в строке перед тем, как передать ее функции, без вызова API я не могу проверить себя.

Тест

encodeURI("testñ$☺PNW¢=")

возвращает

"test%C3%B1$%E2%98%BAPNW%C2%A2="

Он просто ускользает от всех символов, он должен избегать всех недопустимых символов в строке

Тест

encodeURI("¶!┼Æê‼_ðÄÄ┘Ì+\+,o▬MBc§yþó÷ö")

возвращает

"%C2%B6!%E2%94%BC%C3%86%C3%AA%E2%80%BC_%C3%B0%C3%84%C3%84%E2%94%98%C3%8C++,o%E2%96%ACMBc%C2%A7y%C3%BE%C3%B3%C3%B7%C3%B6"

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

Ответ 4

Проблема, с которой вы сталкиваетесь, заключается в том, что ответ считается Unicode String. См. Раздел о Unicode Strings здесь: window.btoa

В этом сообщении предлагаются несколько решений

Ответ 5

База 64 Данные изображения работают для меня, как

<img src="data:image/png;base64,' + responce + '" />