2014-06-28 21 views
5

przechowywać plik podobny do następującego:Jak mogę pobrać plik binarny z MongoDB po jego zapisaniu?

var pdfBinary = fs.readFileSync("myfile.pdf"); 
var invoice = {}; 
invoice.pdf = new mongo.Binary(pdfBinary); 

Następnie wstawić powyższy dokument do MongoDB. Następnie próbuję go pobrać w następujący sposób:

collection.findOne({}, function(err, retrievedPDF) { 
     fs.writeFile("myretrieved.pdf", retrievedPDF.pdf.buffer, function(err) { 
      .... 
     }); 

    }); 

Pojawia się jako plik o rozmiarze zero bajtów. Gdybym console.log zapisany plik wygląda na to, co następuje:

{ pdf: 
{ _bsontype: 'Binary', 
    sub_type: 0, 
    position: 0, 
    buffer: <Buffer > }, 
_id: 53af545681a59758611937d7 } 

Poszedłem poprzez dokumentację Uważam to nieco mylące. Co robię źle, że nie mogę zapisać/pobrać pliku?

Odpowiedz

7

Próbujesz odczytać pusty plik. Sprawdź swój kod, aby załadować plik z dysku i sprawdź plik PDF.

Pusty binarny plik będzie wyglądać następująco:

> console.log(new mongodb.Binary("")); 
{ _bsontype: 'Binary', 
    sub_type: 0, 
    position: 0, 
    buffer: <Buffer > } 

Binary że ma zawartość wygląda mniej więcej tak:

{ _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 ...> } 

Oto kompletny przykład, który pracował dla mnie:

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!'); 
     }); 
    }); 
    }); 
}); 

Dodałem polecenia console.log(), dzięki czemu można łatwo zobaczyć, gdzie jest problem .

1

Z pewnością wygląda na to, że coś poszło nie tak podczas zapisywania. Oto pełny przykład roboczy do porównania z:

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"); 
     }); 
    }); 
    }); 
}); 
Powiązane problemy