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

Javascript dojo/使用NodeJS请求png图像数组缓冲区,并将图像返回给客户端,javascript,node.js,image,rest,dojo,Javascript,Node.js,Image,Rest,Dojo,我试图使用NodeJS和dojo/request从ArcGIS服务器REST提要请求png图像,并将图像返回到客户端 我需要NodeJ向请求添加一个令牌作为查询参数,因为我的服务是安全的,我希望通过节点而不是资源服务器(ArcGIS server 10.3)来控制它们的安全性。如果图片中没有节点,png将加载到浏览器中。这是一个使用标准REST提要返回png图像的调用的(开放)示例: 我正在使用dojo/request访问此资源。png图像似乎很好地回到了节点,但是当我res.send()返回

我试图使用NodeJS和dojo/request从ArcGIS服务器REST提要请求png图像,并将图像返回到客户端

我需要NodeJ向请求添加一个令牌作为查询参数,因为我的服务是安全的,我希望通过节点而不是资源服务器(ArcGIS server 10.3)来控制它们的安全性。如果图片中没有节点,png将加载到浏览器中。这是一个使用标准REST提要返回png图像的调用的(开放)示例:

我正在使用dojo/request访问此资源。png图像似乎很好地回到了节点,但是当我res.send()返回到客户端时,我在Fiddler中得到了一个“nota image”。我可以在hexview中看到PNG头、IHDR和IEND,但是很明显,编码(?或其他)与直接从ArcServer返回资源时不同。在从节点返回的客户机上接收png时,内容长度略小于直接从ArcServer接收相同png时的长度。(默认情况下,节点尝试使用传输编码:Chunked。我将content length设置为响应的长度,因此它一次发送,我相信这是客户端期望的行为。)

ESRI(ArcGIS服务器)有一个新的示例存根,它完全符合我的要求,但是他们使用ESRI/request(基于dojo/request构建)客户端,并利用Blob库为客户端创建正确的响应

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

我已经尝试过复制这个,但似乎node没有可靠的Blob库(我尝试了“Blob”,但运气不好),我在node中读到,您应该使用缓冲区。无论我传递给fileReader什么,我都会收到错误“不能作为文件读取”(我已经尝试了所有fileReader方法)。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,没有创建一个Blob来传递给filereader。如果nodeJS使用缓冲区而不是Blob,那么服务返回的内容似乎是ArrayBuffer png,那么如何通过node将其传递回客户端

我还尝试使用ArrayBuffer-to-Buffer方法(通过Uint8Array),但是一旦我有了Buffer形式的png,我就永远无法读取它

简而言之,我只想将png从源代理到客户端,添加一个令牌查询参数

欢迎评论以改进问题

交叉张贴:


我想做一个类似的动作,但没有找到任何答案。经过反复试验,我似乎已经弄明白了

在请求选项中添加选项
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'));
    }
});
然后,在我的客户机中,我对自己的url进行了一次获取,该url为base64字符串。对于客户端上的图像,可以将源设置为
data:image/PNG;base64,{result}

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

干得好,谁会想到编码=null;这是有道理的。