【问题标题】:Return binary result from phantomjs webserver从 phantomjs 网络服务器返回二进制结果
【发布时间】:2013-08-12 07:08:35
【问题描述】:

有什么方法可以将 PhantomJS 网络服务器的结果作为二进制返回?

更具体地说,如果我将页面的屏幕截图呈现为 base64,我是否可以将此 base64 字符串转换为二进制并返回,以便客户端将其作为图像接收?

这是我目前所做的,我已经注释掉了一些显然不起作用的实验

response.statusCode = 200;
response.setHeader("Content-Type", "image/png");
//response.setHeader("Content-Encoding","base64");
var base64 = page.renderBase64('png');
//var binary=atob(base64,"b");
response.write(base64  );
response.close();       

想法?

【问题讨论】:

  • 你在这个问题上有什么进展吗?

标签: javascript base64 mime-types phantomjs


【解决方案1】:

您可以将编码设置为二进制,它会起作用:

response.statusCode = 200;
response.headers = {
    'Cache': 'no-cache',
    'Content-Type': 'image/png'
};
response.setEncoding('binary');
response.write(atob(page.renderBase64('png')));
response.close();

【讨论】:

  • atob 到底是什么?
  • @devius 解码 BASE64 数据:mdnw3c
  • 偶然发现:二进制编码在当前 PhantomJS 版本中被破坏 (github.com/ariya/phantomjs/issues/13026)
  • 你仍然可以使用旧版本,或者尝试自己编译。你可以只用二进制编码脚本运行旧版本,对吧?
【解决方案2】:

解决方案是在webserver模块中使用binary encoding,在web页面模块中使用page.evaluate来生成二进制内容。

结果是这样的(假设 page 已定义):

response.statusCode = 200;
response.setEncoding("binary");
response.setHeader("Content-Type", "image/png");
var base64 = page.renderBase64('png');
var binary = page.evaluate(function (data) { return atob(data, "b");}, base64);
response.write(binary)
response.close();

【讨论】:

  • 绝对没有必要使用 page.evaluate!它只是更慢!
  • 我也为 webserver 示例设置了内容类型,因此我可以比较 phantomjs 屏幕截图和渲染代码与我的 live firefox 渲染它的解析输出。网络服务器太酷了。你也可以使用 Selenium 和 UnitTest 来自动化这两个测试,例如。
猜你喜欢
  • 1970-01-01
  • 2019-05-02
  • 2015-11-12
  • 2015-01-09
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多