Как получить двоичный файл из MongoDB после его хранения?
Я храню файл, подобный следующему:
var pdfBinary = fs.readFileSync("myfile.pdf");
var invoice = {};
invoice.pdf = new mongo.Binary(pdfBinary);
затем я вставляю вышеуказанный документ в MongoDB. Затем я пытаюсь получить его похожим на следующее:
collection.findOne({}, function(err, retrievedPDF) {
fs.writeFile("myretrieved.pdf", retrievedPDF.pdf.buffer, function(err) {
....
});
});
он выходит как файл с нулевым байтом. Если я утешу.журнал сохраненного файла выглядит следующим образом:
{ pdf:
{ _bsontype: 'Binary',
sub_type: 0,
position: 0,
buffer: <Buffer > },
_id: 53af545681a59758611937d7 }
Я просмотрел документацию, я нахожу это несколько запутанным. Что я делаю неправильно, что я не могу сохранить/получить файл?
2 ответов
вы пытаетесь прочитать пустой файл. Проверьте код для загрузки файла с диска и проверьте файл PDF.
пустой двоичный файл будет выглядеть так:
> console.log(new mongodb.Binary(""));
{ _bsontype: 'Binary',
sub_type: 0,
position: 0,
buffer: <Buffer > }
двоичный файл с содержимым будет выглядеть примерно так:
{ _bsontype: 'Binary',
sub_type: 0,
position: 7867,
buffer: <Buffer 25 50 44 46 2d 31 2e 34 0a 25 c3 a4 c3 bc c3 b6 c3 ...> }
вот полный пример, который сработал для меня:
var fs = require('fs');
var mongo = require('mongodb').MongoClient;
var pdfBinary = fs.readFileSync("testout.pdf");
// print it out so you can check that the file is loaded correctly
console.log("Loading file");
console.log(pdfBinary);
var invoice = {};
invoice.pdf = new mongodb.Binary(pdfBinary);
// set an ID for the document for easy retrieval
invoice._id = 12345;
mongo.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
if(err) console.log(err);
db.collection('invoices').insert(invoice, function(err, doc){
// check the inserted document
console.log("Inserting file");
console.log(doc);
db.collection('invoices').findOne({_id : 12345}, function(err, doc){
if (err) console.error(err);
fs.writeFile('testout.pdf', doc.pdf.buffer, function(err){
if (err) throw err;
console.log('Sucessfully saved!');
});
});
});
});
добавил console.log()
команды, так что вы можете легко увидеть, где находится проблема.
конечно, похоже, что что-то пошло не так в save. Вот полный рабочий пример для сравнения:
var fs = require('fs'),
mongo = require('mongodb'),
MongoClient = mongo.MongoClient,
ObjectId = mongo.ObjectID,
Binary = mongo.Binary;
MongoClient.connect('mongodb://localhost/fs',function(err,db) {
var name = "receptor.jpg";
var binData = fs.readFileSync(name);
var object = {};
object.name = name;
object.data = new Binary(binData);
db.collection("test").findAndModify(
{ name: name },
[],
object,
{ upsert:true },
function(err,data,newObj) {
if ( data == null ) {
console.log(newObj);
} else {
console.log(data);
}
db.collection("test").findOne({ name: name },function(err,data) {
fs.writeFile("ouput.jpg",data.data.buffer,function(err) {
console.log("done");
});
});
});
});