Преобразуйте byte[] в JavaScript Blob с помощью elemental2
Я выполняю вызов сервера Domino-REST для создания PDF-файла. Сервер создает PDF-файл и отправляет его клиенту как byte[]. Теперь я хочу загрузить byte[] на клиентский компьютер, не открывая другое окно браузера.
Я нашел этот вопрос: загрузите массив байтов в виде файла в javascript/Extjs , в котором описывается способ и как это сделать.
Теперь я столкнулся с проблемой: мне нужно преобразовать мой byte[] в Blob, используя elemntal2.
Любая помощь приветствуется. Спасибо
1 ответ
Во-первых, давайте бегло взглянем на документацию MDN по аргументам конструктора Blob :
Параметры
массив — итерируемый объект, такой как массив, имеющий ArrayBuffers, TypedArrays, DataView, Blob, строки или смесь любых таких элементов, которые будут помещены внутрь Blob. Обратите внимание, что строки здесь кодируются как UTF-8, в отличие от обычных строк JavaScript UTF-16.options (необязательно) — объект, который может указывать любое из следующих свойств:
- type Необязательно — MIME-тип данных, которые будут храниться в большом двоичном объекте. Значением по умолчанию является пустая строка ("").
Это подводит нас достаточно далеко, чтобы понять этот код в связанном ответе:
var byteArray = new Uint8Array(arr);
//...
a.href = window.URL.createObjectURL(new Blob([byteArray], { type: 'application/octet-stream' }));
который сначала создает типизированный массив беззнаковых int8, затем оборачивает этот UInt8Array в массив и использует его для создания Blob с указанным типом MIME.
В elemental2 у нас есть те же конструкторы, но я думаю, что мы захотим использовать здесь другой тип TypedArray, поскольку Javabyte
подписаны, поэтому вместо этого давайте посмотрим наelemental2.core.Int8Array
(также доступен на MDN для более понятной документации). Мы можем использовать конструктор для созданияInt8Array
или можете использовать статическийfrom(...)
метод. Ни один из них на самом деле не принимает , но либо хочетdouble[]
илиJsArrayLike<Double>
- с нашей точки зрения как разработчиков Java, это кажется неправильным, но с точки зрения JS GWTbyte[]
обычно это простой JS-массив, который имеет небольшойNumber
s в нем (которые сопоставляются с Javadouble
илиDouble
.
Итак, мы обманываем и приводим то, что нам действительно нужно. Остальная часть кода просто занимается созданием массивов типов объединения, краеугольным случаем Elemental2 и JsInterop, на который нам обычно не нужно пристально вглядываться.
public static Blob makeBlobFromBytes(byte[] byteArray) {
// First, cast our incoming byte[] to something we can wrap in an Int8Array
JsArrayLike<Double> data = Js.uncheckedCast(byteArray);
// Then copy this data into a TypedArray
Int8Array int8Array = Int8Array.from(data);
// Finally wrap in a Blob, with the specified MIME type and other options.
// This part is a bit irritating since we have to use a union in an array:
BlobPropertyBag options = BlobPropertyBag.create();
options.setType("application/octet-stream");
Blob blob = new Blob(JsArray.of(
Blob.ConstructorBlobPartsArrayUnionType.of(int8Array)
), options);
}