Node.js, отображающий изображения из GridFS Монго
У меня есть приложение nodejs, которое использует Mongo и GridFS для хранения изображений. Я пытаюсь отобразить эти изображения в браузере через Node.js (с помощью экспресс-фреймворка).
В настоящее время я использую:
res.writeHead(200, {'Content-Type': 'image/jpeg' });
res.end(imageStore.currentChunk.data.buffer, 'binary');
imageStore - это объект gridStore после создания нового GridStore и вызова gridStore.open (...)
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){ })
2 ответа
Убедитесь, что вы используете драйвер версии 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);
})
})
});
}
env: express (3.0), mongodb-native-driver (1.2), mongodb (2.2)
gs - информация о файле после GridStore.writeFile
res - объект экспресс-ответа
monogodb.GridStore.read(db, gs["_id"], function(err, data) {
res.setHeader('Content-Type', gs.contentType);
res.setHeader('Content-Length', gs.length);
res.setHeader('Content-Disposition', 'inline; filename="' + gs.filename + '"');
res.end(data);
});