Express - 从 Web 服务返回二进制数据

Posted

技术标签:

【中文标题】Express - 从 Web 服务返回二进制数据【英文标题】:Express - Return binary data from webservice 【发布时间】:2015-07-24 14:55:54 【问题描述】:

我尝试使用 Express 返回一些二进制数据。在示例中,它是 PDF,但理论上,它可以是任何类型的文件。

但现在只关注 pdf。我写了这段代码:

app.get('*', function (req, res) 
    getBinaryData(req.url,
        function (answer) 
            res.type('pdf');
            res.end(new Buffer(answer, 'binary'));
        ,
        function (error) 
            res.setHeader('Content-Type', 'text/plain');
            return res.end(error);
        
    );
);

根据我在这里看到的:https://github.com/strongloop/express/issues/1555

但是,我得到了一个页数正确的 pdf 文件,正确的标题....但是所有页面都是空白的

我很担心 getBinaryData() 的返回,因为这个函数请求了一个外部 Web 服务,当我直接请求这个服务时,我得到了正确的文档。

提前感谢您的回答

【问题讨论】:

为什么不用res.sendFile方法? 因为我没有该文件:我从另一个 WebService 获取此二进制内容。最终,我可以创建一个临时文件并使用 sendFile... 【参考方案1】:

我找到了一个更简单的解决方案:

request(req.url).pipe(res);

这会将来自远程 Web 服务的原始响应直接传递给我的响应!无论文件类型如何,我都得到了正确的文件。

【讨论】:

我尝试了同样的事情,但它不适合我。 ***.com/questions/37517312/… request(req.url).pipe(res)的request lib驻留在哪个库中? 大家都想知道request来自什么库,它是一个内置的节点模块,所以在调用之前添加const request = require('request');【参考方案2】:

这是我稍微清理过的如何使用 Express 返回二进制文件的版本。我假设数据在一个可以声明为二进制且有长度的对象中:

exports.download = function (data, filename, mimetype, res) 
    res.writeHead(200, 
        'Content-Type': mimetype,
        'Content-disposition': 'attachment;filename=' + filename,
        'Content-Length': data.length
    );
    res.end(Buffer.from(data, 'binary'));
;

【讨论】:

轻微错字。应该是:res.end(new Buffer(data), 'binary') 请记住 new Buffer() 已被弃用,它存在安全问题。 @realtebo 您可以使用 Buffer.from() - 有关更多示例,请参阅 Node.js 文档。 new Buffer() 已弃用,请改用Buffer.from() 为什么在数据是二进制时使用 Buffer.from,那不是为字符串保留的吗?你不需要使用 Buffer.alloc 吗?

以上是关于Express - 从 Web 服务返回二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Web 服务器连接到 SQL Server Express

服务器未将 JSON 从 Express 返回到 React(代理)

详解express搭建http服务,通过路由和中间件获取静态文件和动态数据的实现原理

如何让服务器将远程 json 对象返回给客户端?反应/快递/web3

从 ASP.NET Web API 中的控制器返回二进制文件

通过重定向将数据从 Express 发送到 React