javascript - 使用 Node 创建的图像响应 GET 请求

标签 javascript node.js http canvas

我有一个简单的 Node Api,它接受 GET 请求,使用 node canvas 构造 Canvas 。 ,将其另存为 PNG,并将其发送回服务器。我可以保存它,但无法将其返回到服务器。路由器是:

router.get('/canvas', function(req, res) {

    var callback = function(data){

         res.writeHead(200, {'Content-Type': 'text/html'});
          res.write('<img src="data:image/jpeg;base64,')
          res.write(new Buffer(data).toString('base64'));
          res.end('"/>');
    };

    canvas.getCanvas(callback);

});

Node 模型是:

  var getCanvas = function(callback){

    var Canvas = require('canvas'),
    canvas = new Canvas(150, 150),
    ctx = canvas.getContext('2d'),
    fs = require('fs');


    ctx.font = '30px Impact';
    ctx.rotate(.1);
    ctx.fillText("Awesome!", 50, 100);

    var te = ctx.measureText('Awesome!');
    ctx.strokeStyle = 'rgba(0,0,0,0.5)';
    ctx.beginPath();
    ctx.lineTo(50, 102);
    ctx.lineTo(50 + te.width, 102);
    ctx.stroke();


    var out = fs.createWriteStream(__dirname + '/text2.png'),
        stream = canvas.pngStream();


    stream.on('data', function(chunk){
      out.write(chunk);
    });

    stream.on('end', function(){
      console.log('saved png');
      fs.readFile(__dirname +'/text2.png', function(err, data) {

          if (err) throw err; // Fail if the file can't be read.

            callback(data);
        });
    });

  }

module.exports.getCanvas = getCanvas;

PNG 被保存到文件系统,但在浏览器对 GET 请求的响应中我只看到:

<img src="data:image/jpeg;base64,iVBORw0KGgo="/>

而且大小只有370字节,所以浏览器显然是收不到图像的。如何将此图像作为 GET 请求的响应发送回来?还有一个相关的问题,我是否需要将其保存到文件系统,或者我可以在创建图像后以某种方式将其流回吗?

最佳答案

不要先写入文件,然后读取该文件,而是将 block 添加到数组中,然后将其连接到缓冲区中,因此更改:

stream.on('data', function(chunk){
  out.write(chunk);
});

成为

var chunks = [];
stream.on('data', function(chunk){
  out.write(chunk); //remove this if you have no need to keep file local
  chunks.push(chunk);
});

然后将你的终端更改为:

stream.on('end', function(){
  console.log('saved png');
  callback(Buffer.concat(chunks));
});

由于您的回调现在接受缓冲区,因此也更改此位:

var callback = function(data){

     res.writeHead(200, {'Content-Type': 'text/html'});
      res.write('<img src="data:image/jpeg;base64,')
      res.write(data.toString('base64'));
      res.end('"/>');
};

关于javascript - 使用 Node 创建的图像响应 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664217/

相关文章:

javascript - jQuery/Javascript 从对象中提取信息

node.js - Node js url.parse—href 不返回完整的 url

javascript - 等待所有回调完成执行,没有静态时间

http - 使用 HTTP Post 从客户端流式传输数据

javascript - 回调嵌套和 this 的范围

javascript - 有没有办法用 Vue.JS SPA 刷新 Laravel Passport 的 cookie token ?

javascript - 如何在 JavaScript 中交换两个变量

node.js - 无法使用node-oauth模块下载文件

HTTP header 怪异字段解释

macos - "Ad-hoc webserver"用于 UNIX/MacOSX 上的静态文件?