首页 文章

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

提问于
浏览
3

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

我需要nodeJS作为查询参数向请求添加令牌,因为我的服务是安全的,我想通过节点而不是资源服务器(ArcGIS Server 10.3)来控制它们的安全性 . 如果没有图片中的nodeJS,则在浏览器中加载png . 这是使用标准REST提要返回png图像的调用的(开放)示例:https://sampleserver6.arcgisonline.com/arcgis/rest/services/911CallsHotspot/MapServer/1/images/257104fa1b21d7b483c160ee8f3943bb

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

ESRI(ArcGIS Server)有一个新的示例存根,它完全符合我的要求,但它们使用esri / request(构建在dojo / request上)客户端,并利用Blob库为客户端创建正确的响应 . https://developers.arcgis.com/javascript/jssamples/data_requestArrayBuffer.html

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

我已经尝试过ad-nausuem来复制这个,但似乎节点没有可靠的Blob库(我已经尝试了"Blob"没有运气)而且我在节点中读到了你应该使用Buffers代替 . 无论我传递给fileReader,我都会收到错误"Cannot read as File"(我已经尝试了所有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
});

我的尝试:

//尝试处理:“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使用Buffers而不是Blob,假设服务返回的内容看起来是ArrayBuffer png,我该如何通过节点将其传递回客户端?

我也试图使用ArrayBuffer来缓冲方法(通过Uint8Array)但是一旦我有缓冲区形式的png,我就永远无法读取它 .

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

欢迎评论改进这个问题 .

交叉发布:

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

1 回答

  • 3

    我当时想做类似的动作,但没有找到任何答案 . 经过一些试验和错误,我似乎已经弄明白了 .

    在您的请求选项中添加选项 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上做了一个GET,它给你base64字符串 . 对于客户端上的图像,您可以将源设置为 data:image/PNG;base64,{result}

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

相关问题