Преобразование данных типа контента application / java-archive в объект blob - PullRequest
0 голосов
/ 05 июля 2018

У меня есть один запрос GET, который возвращает файл JAR, который мне нужно скачать. Самый простой способ загрузки части - это позволить браузеру обрабатывать часть загрузки следующим образом:

window.location.href = URL

Но это не работает для обработки ошибок (обработка ошибок сервера).

В качестве альтернативы, Я нашел другой способ , который создает объект BLOB-объекта и создает URL-адрес объекта из этого объекта и назначает его для привязки тега для загрузки -

callSomeURL().then((res) => {
  const blob = new Blob([res._body], { type: res.headers.get('content-type') 
  });
  const url = window.URL.createObjectURL(blob);
  const linkElement = document.createElement('a');
  linkElement.setAttribute('href', url);
  linkElement.setAttribute('download', 'test jar file');
  const clickEvent = new MouseEvent('click', {view: window});
  linkElement.dispatchEvent(clickEvent);
}).catch((error) => error handling part)

тип содержимого - «application / java-archive» res._body - закодированная строка.

Проблема в том, что загруженный файл неверен / поврежден. (Не уверен, что не так с реализацией).

У меня есть 2 вопроса здесь -

  1. Как правильно создать объект BLOB-объекта? Он создан с использованием закодированных данных, которые возвращает ответ, или URL запроса?
  2. Как правильно загружать файлы с обработкой ошибок?

1 Ответ

0 голосов
/ 05 июля 2018

Ваша проблема в том, что вы получаете простой текстовый ответ. Поэтому, когда вы генерируете свой BLOB-объект, он все еще представляет собой обычный текст, и двоичные данные искажаются при преобразовании в utf16 с помощью javascript.

Чтобы избежать этого, вы можете запросить его как BLOB-объект непосредственно из вашего вызова ajax.

С помощью XMLHttpRequest вы можете установить параметр responseType вашего объекта XHR:

var xhr = new XMLHttpRequest();
xhr.open('get', your_url);
xhr.responseType = 'blob';
xhr.onload = function() {
   var blob = xhr.response;
   // do something with the blob
   var url = URL.createObjectURL(blob);
   anchor.href = url
   anchor.click();
};
xhr.send();

С помощью API выборки вы можете вызвать метод blob() объекта Response

fetch(your_url)
  .then(resp => resp.blob())
  .then(doSomethingWithBlob)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...