Більше

Dojo / запитувати буфер масиву зображень png за допомогою NodeJS і повернути зображення клієнту

Dojo / запитувати буфер масиву зображень png за допомогою NodeJS і повернути зображення клієнту


Я намагаюся запитати зображення у форматі PNG за допомогою NodeJS і dojo / request із стрічки REST сервера ArcGIS і повернути зображення клієнту.

Мені потрібно nodeJS, щоб додати маркер до запиту як параметр запиту, оскільки мої служби захищені, і я хочу контролювати їх безпеку через вузол, а не на сервері ресурсів (ArcGIS Server 10.3). Без nodeJS на зображенні, png завантажується у браузері. Це (відкритий) приклад дзвінка, що повертає зображення PNG, використовуючи їх стандартний канал REST: https://sampleserver6.arcgisonline.com/arcgis/rest/services/911CallsHotspot/MapServer/1/images/257104fa1b21d7b483c160ee8f3943bb

Я використовую dojo / request для доступу до цього ресурсу. Здається, зображення png повертається до вузла нормально, однак, коли я res.send () повертаюся до клієнта, я отримую `` не зображення '' у Fiddler. Я бачу заголовок PNG, а також IHDR та IEND у hexview, однак очевидно, що кодування (? Або інше) не те саме, що коли ресурс повертається безпосередньо з ArcServer. Коли png отримується на клієнті, що повертається з вузла, довжина вмісту трохи менше, ніж коли цей самий png надходить безпосередньо з ArcServer. (Вузол намагається за замовчуванням використовувати Transfer-Encoding: Chunked. Я встановлюю довжину вмісту на довжину відповіді, тому він надсилає одночасно, що, на мою думку, є поведінкою, яку очікує клієнт.)

ESRI (ArcGIS Server) має новий зразок заглушки, який робить саме те, що я хочу зробити, однак вони використовують esri / request (побудований на dojo / request) на стороні клієнта та використовують бібліотеку BLOB для створення правильної відповіді для клієнта. https://developers.arcgis.com/javascript/jssamples/data_requestArrayBuffer.html

Ми бачимо, що вони використовують handleAs: "arrayBuffer", який я спробував на dojo / request, і, схоже, це не має значення для вмісту поверненого png. Отримавши відповідь, вони роблять новий Blob, а потім читають його як URL-адресу даних за допомогою FileReader (який у мене є реалізацією на стороні вузла) і безпосередньо використовують цей результат як png.

Я спробував ad-nausuem відтворити це, але, схоже, вузол не має надійної бібліотеки Blob (я пробував "Blob", не маючи удачі), і я прочитав, що у node замість цього ви повинні використовувати буфери. Незалежно від того, що я передаю fileReader, я отримую повідомлення про помилку "Не вдається прочитати як файл" (я спробував усі методи fileReader). Бібліотека fileReader: https://www.npmjs.com/package/filereader

Код ESRI:

esriRequest (url, {handleAs: "arrayBuffer"}). then (function (response) {reader.readAsDataURL (new Blob ([response], {type: "image / png"})); //reader.result is png готовий до використання на стороні клієнта});

Мої спроби:

// пробував handleAs: "arrayBuffer"

// спробував бібліотеку BLOB-файлів npm

request (url, {handleAs: "arrayBuffer"}). then (function (response) {var reader = new FileReader (); reader.addEventListener ("loadend", function () {res.setHeader ('Content-Type', 'image / png'); res.setHeader ('Content-Length', reader.result.length); res.send (reader.result);}); reader.readAsDataURL (новий Blob ([відповідь], {тип: "image / png"})));});

Я використовую пакет вузлів filereader та Blob, не маючи щастя створити BLOB для передачі в fileReader. Якщо nodeJS використовує буфери замість Blob, враховуючи, що вміст, що повертається службою, здається ArrayBuffer png, як я можу повернути це клієнту через вузол?

Я також намагався використовувати ArrayBuffer для буферизації методів (через Uint8Array), однак, коли у мене є png у формі буфера, я ніколи не можу його прочитати.

Коротше кажучи, я просто хочу проксі-файл png від його джерела до клієнта, додавши параметр запиту маркера.

Коментарі ласкаво просимо покращити питання.

Хрест розміщено:

https://stackoverflow.com/questions/34341327/dojo-request-a-png-image-array-buffer-using-nodejs-and-return-the-image-to-the

https://geonet.esri.com/message/575847#575847


Відповів Дієта на stackoverflow: щоб отримати зображення в base64, мені потрібно було включити

кодування: нуль

як опція на запит.

Відповідь: https://stackoverflow.com/questions/34341327/dojo-request-a-png-image-array-buffer-using-nodejs-and-return-the-image-to-the/36182182#36182182

Я прагнув зробити подібну дію, але не знайшов відповіді. Після деяких спроб і помилок, здається, я це зрозумів.

У параметрах запиту додайте опцію кодування: null, це отримає зображення у форматі base64 з вихідного джерела.

запит ({url: yoururl, метод: 'GET', кодування: null}, функція (помилка, відповідь, тіло) {if (! error && response.statusCode === 200) {res.send (response.statusCode, body );} else {res.send (response.statusCode, body.toString ('utf8'));}});

Потім у своєму клієнті я зробив GET за власною URL-адресою, який дає вам рядок base64. Для вашого зображення на клієнті ви можете встановити для джерела дані: image / PNG; base64, {result}

var результат = getBase64FromMyUrl (); var src = 'дані: зображення / PNG; base64,' + результат;