Daha çox

Dojo / NodeJS istifadə edərək bir png şəkil array tamponu tələb edin və şəkli müştəriyə qaytarın


NodeJS və dojo istifadə edərək bir PNG görüntüsünü istəməyə / ArcGIS Server REST lentindən tələb istəməyə və görüntüyü müştəriyə qaytarmağa çalışıram.

Xidmətlərim təmin edildiyi üçün sorğu parametri olaraq sorğuya bir mö'cüzə əlavə etmək üçün nodeJS-yə ehtiyacım var və onların təhlükəsizliyini mənbə serverində deyil, qovluq vasitəsilə idarə etmək istəyirəm (ArcGIS Server 10.3). Şəkildə nodeJS olmadan brauzerdə png yüklənir. Bu, standart REST lentindən istifadə edərək, bir png şəklini qaytaran bir çağrının (açıq) nümunəsidir: https://sampleserver6.arcgisonline.com/arcgis/rest/services/911CallsHotspot/MapServer/1/images/257104fa1b21d7b483c160ee8f3943bb

Bu mənbəyə daxil olmaq üçün dojo / sorğusundan istifadə edirəm. Görünür ki, png şəkli yaxşı bir şəkildə düyünə qayıdır, lakin res.send () -i müştəriyə qaytardığımda, Fiddler-də 'bir şəkil deyil' olur. PNG başlığını və hexviewdə IHDR və IEND-i görə bilərəm, amma kodlaşdırmanın (? Və ya digər) mənbənin birbaşa ArcServer-dən qaytarılması ilə eyni olmadığı aydın görünür. Png qovşaqdan qaytarılan müştəriyə qəbul edildikdə, məzmun uzunluğu eyni png ArcServer-dən birbaşa gəldiyindən bir az azdır. (Node, varsayılan olaraq Transfer-Encoding: Chunked istifadə etməyə çalışır. Cavabın uzunluğuna məzmun uzunluğu təyin etdim, buna görə müştərinin gözlədiyi davranış olduğuna inandığım bir anda göndərir.)

ESRI (ArcGIS Server) etmək istədiyim şeyi yerinə yetirən yeni bir nümunə çıxardı, lakin esri / request (dojo / request üzərində qurulmuş) müştəri tərəfini istifadə edir və müştəri üçün düzgün cavab yaratmaq üçün Blob kitabxanasından istifadə edir. https://developers.arcgis.com/javascript/jssamples/data_requestArrayBuffer.html

Dojo / request üzərində çalışdığım və geri dönmüş png-in məzmununa heç bir fərq qoymadığına görə handleAs: "arrayBuffer" istifadə etdiklərini görə bilərik. Cavab aldıqda, yeni bir Blob hazırlayırlar və sonra FileReader ilə bir məlumat URL olaraq oxuyurlar (bir düyün tərəfi tətbiqinə sahibəm) və nəticəni birbaşa png olaraq istifadə edirlər.

Bunu çoxaltmaq üçün ad-nausuem-dən istifadə etdim, amma görünən budur ki, düyünün etibarlı bir Blob kitabxanası yoxdur ("Şanssız" "Blob" ı sınamışam) və oxudum ki, qovluqda əvəzinə Tamponlar istifadə etməlisiniz. FileReader-a nə keçməyimdən asılı olmayaraq, "Fayl olaraq oxumaq olmur" səhvini alıram (bütün fileReader metodlarını sınamışam). FileReader kitabxanası: https://www.npmjs.com/package/filereader

ESRI kodu:

esriRequest (url, {handleAs: "arrayBuffer"}). sonra (function (response) {reader.readAsDataURL (new Blob ([response], {type: "image / png"})); //reader.result png müştəri tərəfini istifadə etməyə hazır});

Mənim cəhdlərim:

// sınandı handleAs: "arrayBuffer"

// npm Blob kitabxanasını sınadı

sorğu (url, {handleAs: "arrayBuffer"}). sonra (funksiya (cavab) {var oxucu = yeni FileReader (); reader.addEventListener ("loadend", function () {res.setHeader ('Content-Type' ', 'image / png'); res.setHeader ('Content-Length', reader.result.length); res.send (reader.result);}); reader.readAsDataURL (yeni Blob ([cavab], {növü: "image / png"}));});

Düyün paketi filereader və Blob istifadə edirəm, heç bir uğurla fileReader-a keçmək üçün bir blob yaratmıram. NodeJS, Blob əvəzinə Tamponlar istifadə edirsə, xidmət tərəfindən qaytarılmış məzmunun ArrayBuffer png kimi göründüyünü nəzərə alsaq, onu müştəriyə node vasitəsilə necə ötürə bilərəm?

ArrayBuffer-dən Tampon üsullarına (Uint8Array vasitəsilə) istifadə etməyə çalışdım, ancaq png bufer formasına sahib olduqda onu heç vaxt oxuya bilmirəm.

Qısacası, sadəcə bir işarəsi sorğu parametri əlavə edərək png-i mənbəyindən müştəriyə proxy etmək istəyirəm.

Şərhlər sualı yaxşılaşdırmaq üçün xoş gəlmisiniz.

Xaç göndərildi:

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-da Dietah tərəfindən cavab: Təsviri base64-də almaq üçün daxil etməyim lazım idi

kodlaşdırma: boş

istək üzrə seçim olaraq.

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

Bənzər bir hərəkət etmək istəyirdim, amma cavab tapmadım. Bəzi sınaqlardan və səhvlərdən sonra bunu başa düşmüşəm deyəsən.

İstək seçimlərinizə kodlama seçimini əlavə edin: null, bu orijinal bazadan bir base64 formatında şəkil alacaq.

sorğu ({url: yoururl, metod: 'GET', kodlama: null}, funksiya (səhv, cavab, bədən) {if (! error && response.statusCode === 200) {res.send (response.statusCode, body );} başqa {res.send (response.statusCode, body.toString ('utf8'));}});

Sonra müştərimdə sənə base64 simli verən öz urlimdə GET etdim. Müştəri üzərindəki şəkliniz üçün mənbəyi məlumat üçün qura bilərsiniz: image / PNG; base64, {result}

var result = getBase64FromMyUrl (); var src = 'data: image / PNG; base64,' + nəticə;


Videoya baxın: Json array in Node js (Oktyabr 2021).