【问题标题】:Render an image with nodejs使用 nodejs 渲染图像
【发布时间】:2012-08-03 22:57:15
【问题描述】:

我在 mongodb 中使用 BinData 类型存储图像。

我可以使用 mongojs 查询数据库。

db.images.findOne({

                   file_name: 'temp.jpg',
                  },

              function(err, data){

                console.log(data.image); // image buffer appears on the console
                res.writeHead(200, {'Content-Type': 'image/jpg'});
                res.end(data.image);

           });

这会产生“TypeError:第一个参数必须是字符串或缓冲区”。

我很确定这与缓冲区或编码有关。 有人可以解释一下在发送到浏览器之前我应该​​对图像数据做什么吗?

【问题讨论】:

  • 错误是在 db.images.findOne 行还是在回调函数中抛出的?
  • 我认为问题在于回调函数中的图像数据不是“正确”格式
  • 你能在你的回调中做一个“typeof data.image”吗?我怀疑问题是 data.image 是图像缓冲区,因此需要将其转换为其他内容才能发回。尝试将其转换为base64,即data.image.toString('base64')
  • typeof data.image 是对象。我不再使用 toString("base64") 到达那里,但浏览器上的图像已损坏。可能是因为图片不是base64而是二进制类型。
  • 尝试不带参数的 toString()。此外,您可能想要验证存储在 mongo 中的数据是否没有以某种方式被修改。这里有一些关于如何在 mongo 中存储二进制内容的信息,mongodb.org/display/DOCS/GridFS。未优化的方法也是在存储到 mongo 之前对图像数据进行 base64 编码,因此它将作为字符串存在。然后可以在发送到客户端之前将其读回并转换为二进制。

标签: javascript node.js mongodb


【解决方案1】:
  • 设置正确的内容类型
  • 设置正确的内容长度

我如何从 mongodb gridfs 提供文件的简短示例

.getFileFromGridFs(doc,function(err, buffer){
  if(err) return next(err)
  res.setHeader('content-type',doc.mimeType)
  res.setHeader('content-length',doc.size)
  buffer.pipe(res)
})

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多