我有一个nodejs应用程序,它使用mongo和gridfs来存储图像。我正试图通过node.js(使用express framework)将这些图像显示到浏览器中。
我正在使用:

            res.writeHead(200, {'Content-Type': 'image/jpeg' });
            res.end(imageStore.currentChunk.data.buffer, 'binary');

imagestore是在创建新的gridstore并调用gridstore.open(…)之后的gridstore对象。
       var gridStore = new GridStore(self.collection.db, doc._id, doc.filename, 'r', {
            chunk_size: doc.chunkSize
        });
        gridStore.open(callback);

我肯定这不是正确的方式,它显示一个破碎的图像。有什么建议吗?
谢谢!
编辑:
在更新到MongoDB Native 1.0.2之后,我尝试使用以下方法来传输数据:
res.contentType("image/jpeg");
var imageStream = imageStore.stream(true);
imageStream.pipe(res);

imagestore是使用gridStore.open(function(err, imageStore){ })

最佳答案

确保您使用的是驱动程序的1.0.1版本,并使用http请求的管道来传输数据,下面的示例是对文件执行此操作。在1.1中,它将变得更好,因为gridstore对象将是一个读/写流兼容的对象:)

/**
 * A simple example showing how to pipe a file stream through from gridfs to a file
 *
 * @_class gridstore
 * @_function stream
 * @ignore
 */
exports.shouldCorrectlyPipeAGridFsToAfile = function(test) {
  var db = new Db('integration_tests', new Server("127.0.0.1", 27017,
   {auto_reconnect: false, poolSize: 1, ssl:useSSL}), {native_parser: native_parser});

  // Establish connection to db
  db.open(function(err, db) {
    // Open a file for writing
    var gridStoreWrite = new GridStore(db, "test_gs_read_stream_pipe", "w", {chunkSize:1024});
    gridStoreWrite.writeFile("./test/gridstore/test_gs_weird_bug.png", function(err, result) {
      // Open the gridStore for reading and pipe to a file
      var gridStore = new GridStore(db, "test_gs_read_stream_pipe", "r");
      gridStore.open(function(err, gridStore) {
        // Grab the read stream
        var stream = gridStore.stream(true);
        // When the stream is finished close the database
        stream.on("end", function(err) {
          // Read the original content
          var originalData = fs.readFileSync("./test/gridstore/test_gs_weird_bug.png");
          // Ensure we are doing writing before attempting to open the file
          fs.readFile("./test_gs_weird_bug_streamed.tmp", function(err, streamedData) {
            // Compare the data
            test.deepEqual(originalData, streamedData);

            // Close the database
            db.close();
            test.done();
          });
        })

        // Create a file write stream
        var fileStream = fs.createWriteStream("./test_gs_weird_bug_streamed.tmp");
        // Pipe out the data
        stream.pipe(fileStream);
      })
    })
  });
}

关于node.js - Node.js显示来自Mongo的GridFS的图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10588872/

10-11 09:06