dojo /使用NodeJS请求一个png图像数组缓冲区,并将图像返回给客户端

我正尝试使用NodeJS和ArcGIS Server REST提要中的dojo / request来请求png图像,并将图像返回给客户端。

我需要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中得到了一个“不是图像”。 我可以在hexview中看到PNG头文件,以及IHDR和IEND,但显然编码(?或其他)与直接从ArcServer返回资源时不同。 当从节点返回的客户端接收到png时,内容长度比直接从ArcServer直接发送相同的png要less一些。 (Node默认尝试使用Transfer-Encoding:Chunked,我将content-length设置为响应的长度,所以它一次发送,我相信这是客户端期望的行为)。

ESRI(ArcGIS Server)有一个新的示例存根,它正是我想要做的,然而他们使用esri / request(build立在dojo / request)客户端,并利用Blob库为客户端创build正确的响应。 https://developers.arcgis.com/javascript/jssamples/data_requestArrayBuffer.html

我们可以看到他们使用handleAs:“arrayBuffer”,我已经尝试了dojo / request,并且它对返回的png的内容似乎没有任何区别。 当他们收到响应时,他们创build一个新的Blob,然后用FileReader(我有一个节点端实现)读取它作为数据URL,并直接使用该结果作为png。

我已经尝试过ad-nausuem来复制这个,但是看起来节点没有一个可靠的Blob库(我没有尝试过“Blob”),并且我在节点中读到了你应该使用Buffers。 不pipe我传递给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 ready to use client side }); 

我的尝试:

//试过handleAs:“arrayBuffer”

//尝试npm Blob库

 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(new Blob([response], { type: "image/png" })); }); 

我正在使用节点包filereader和Blob,没有运气创build一个blob传递给fileReader。 如果nodeJS使用Buffers而不是Blob,假设服务返回的内容看起来像是一个ArrayBuffer png,那么我怎样通过节点把它传回客户端?

我也试图使用ArrayBuffer的缓冲区方法(通过Uint8Array),但是一旦我有缓冲区forms的PNG,我永远不会读取它。

总之,我只是想从源代理png到客户端,添加一个令牌查询参数。

欢迎提出意见,以改善问题。

Cross发表:

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

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

我正在寻找类似的行动,但没有find任何答案。 经过一些试验和错误,我似乎已经想通了。

在您的请求选项中添加选项encoding: null ,这将从原始来源获取base64格式的图像。

 request({ url: yoururl, method: 'GET', encoding: null }, function (error, response, body) { if (!error && response.statusCode === 200) { res.send(response.statusCode, body); } else { res.send(response.statusCode, body.toString('utf8')); } }); 

然后在我的客户端,我做了一个GET我自己的url,它给你base64string。 对于客户端上的图像,您可以将源设置为data:image/PNG;base64,{result}

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