1

我使用快递。我不知道如何以将图像文件显示到 HTML 标签的方式将图像文件发送到客户端<img src='/preview/?doc=xxxxxx&image=img1.jpg'>。我正在使用 Cradle getAttachment 函数与 Couchdb https://github.com/flatiron/cradle进行通信

db.getAttachment(id, filename, function (err, reply) {
    set('Content-Type', 'image/png');
    res.end(reply);
});

我不知道究竟reply是什么以及如何在没有缓冲区的情况下将该图像传输到客户端

4

1 回答 1

6

要在不缓冲的情况下将附件从 cradle 传输到客户端,您可以通过管道将其readableStream传输到响应的writableStream

长版

摇篮的变体db.getAttachment返回 a readableStream(请参阅从摇篮的文档流式传输)。res另一方面,express'对象用作writableStream. 这意味着您应该能够* 像这样通过管道将附件连接到它:

// respond to a request like '/preview/?doc=xxxxxx&image=img1.jpg'
app.get('/preview/', function(req, res){

  // fetch query parameters from url (?doc=...&image=...)
  var id = req.query.doc
  var filename = req.query.image

  // create a readableStream from the doc's attachment
  var readStream = db.getAttachment(id, filename, function (err) { 
    // note: no second argument
    // this inner function will be executed 
    // once the stream is finished
    // or has failed
    if (err)
      return console.dir(err)
    else
      console.dir('the stream has been successfully piped')
  })
  // set the appropriate headers here
  res.setHeader("Content-Type", "image/jpeg")

  // pipe the attachment to the client's response
  readStream.pipe(res)
})

或者,稍微短一点:

app.get('/preview/', function(req, res){
  res.setHeader("Content-Type", "image/png")
  db.getAttachment(req.query.doc, req.query.image, someErrorHandlerFunction).pipe(res)
})

*我不在工作,所以很遗憾我无法验证此代码是否会运行。如果您有问题,请给我留言。

于 2014-07-25T09:47:17.417 回答