Как получить байтовый массив внутри JSON - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь получить PDF-файл от сервера, который будет обернут в JSON.

Если я отправляю только байтовый массив pdf во внешний интерфейс, я могу правильно его прочитать,установив responseType в arraybuffer, тогда я могу скачать PDF следующим образом:

var blob = new Blob([data], { type: application/pdf});
    if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
        $window.navigator.msSaveOrOpenBlob(blob);
    } else {
        var a = document.createElement("a");
        document.body.appendChild(a);
        var fileURL = URL.createObjectURL(blob);
        a.href = fileURL;
        a.download = fileName;
        a.click();
    }
}

Однако, когда сервер пытается отправить JSON с байтовым массивом внутри, если я установлю responseType в JSONтогда я не смогу конвертировать блоб.Но если я установлю responseType на arrayBuffer, я получу массив arrayBuffer, как мне преобразовать его в JSON, и при этом потом можно будет извлечь PDF:

Получаемый JSONв форме:

{
  result: true,
  value: <the pdf byte array>,
  errorMessage: null
}

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вам следует преобразовать байты в строку base64 и в интерфейсе пользователя читать байты из нее.

0 голосов
/ 10 февраля 2019

Если предполагается, что приведенная ниже переменная представляет структуру responseText:

responseText = {
      result: true,
      value: <the pdf byte array>,
      errorMessage: null
}

responseText.value - это байтовый массив.Если байтовый массив уже напечатан как Uint8Array, тогда это будет работать.

( Примечание: существуют другие типизированные массивы , поэтому выберите, какой из них лучше всего подходит для вашего случая ):

var blob = new Blob([response.value], { type: 'application/pdf'});
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    window.navigator.msSaveOrOpenBlob(blob);
} else {
    var a = document.createElement("a");
    document.body.appendChild(a);
    var fileURL = URL.createObjectURL(blob);
    a.href = fileURL;
    a.download = 'test';//filename
    a.click();
}

Однако, если естьявляется массивом строк или целочисленным массивом байтов, как показано ниже:

responseText.value = [145, 229, 216, 110, 3]

, и его необходимо преобразовать в типизированный байтовый массив, тогда будет работать нижеследующее:

var ba = new Uint8Array(responseText.value);

или

var ba = new Uint8Array([145, 229, 216, 110, 3]);

Следовательно,

var blob = new Blob([ba], { type: 'application/pdf'}); 

Таким образом, байтовый массив можно использовать для создания большого двоичного объекта, поэтому файлзагружается при возникновении события click.

0 голосов
/ 05 февраля 2019

Установить значение байтового массива в виде строки.При синтаксическом анализе JSON преобразуйте строку в байтовый массив.

ссылается на этот Java Byte Array на String на Byte Array в качестве примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...