Как получить байтовый массив внутри 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 для примера.