Как получить байтовый массив внутри JSON

Я пытаюсь получить 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 ответа

Решение

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

Если предполагается, что указанная ниже переменная представляет структуру 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 событие пожары.

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

обратитесь к этому Java Byte Array к String to Byte Array для примера.

Другие вопросы по тегам