2013-05-10 10 views
7

Ich habe angefangen mit expressJS eine REST API zu erstellen. Ich bin neu in Knoten, also bitte ertragen Sie mit mir. Ich möchte in der Lage sein, Benutzer eine Datei direkt zu Mongos GridFS hochladen zu lassen, indem sie einen Post zur/Upload-Route verwenden.Datei in Mongos GridFS mit ExpressJS nach dem Upload speichern

Aus was ich in der expressJS-Dokumentation verstehe, ist das req.files.image-Objekt in der Route nach dem Hochladen verfügbar, das auch ein Pfad- und Dateinamenattribut enthält. Aber wie kann ich die Bilddaten genau lesen und in GridFS speichern?

Ich habe in gridfs-stream untersucht, aber ich kann die Enden nicht zusammenbinden. Muss ich zuerst die Datei lesen und diese Daten dann für die Writestream-Pipe verwenden? Oder kann ich einfach das Dateiobjekt von express verwenden und diese Attribute verwenden, um einen Schreibstream zu erstellen? Irgendwelche Hinweise würden geschätzt werden!

Antwort

29

Hier ist eine einfache Demo:

var express = require('express'); 
var fs  = require('fs'); 
var mongo = require('mongodb'); 
var Grid = require('gridfs-stream'); 
var db  = new mongo.Db('test', new mongo.Server("127.0.0.1", 27017), { safe : false }); 

db.open(function (err) { 
    if (err) { 
    throw err; 
    } 
    var gfs = Grid(db, mongo); 
    var app = express(); 

    app.use(express.bodyParser()); 
    app.post('/upload', function(req, res) { 
    var tempfile = req.files.filename.path; 
    var origname = req.files.filename.name; 
    var writestream = gfs.createWriteStream({ filename: origname }); 
    // open a stream to the temporary file created by Express... 
    fs.createReadStream(tempfile) 
     .on('end', function() { 
     res.send('OK'); 
     }) 
     .on('error', function() { 
     res.send('ERR'); 
     }) 
     // and pipe it to gfs 
     .pipe(writestream); 
    }); 

    app.get('/download', function(req, res) { 
    // TODO: set proper mime type + filename, handle errors, etc... 
    gfs 
     // create a read stream from gfs... 
     .createReadStream({ filename: req.param('filename') }) 
     // and pipe it to Express' response 
     .pipe(res); 
    }); 

    app.listen(3012); 
}); 

I httpie verwenden, um eine Datei zu laden:

http --form post localhost:3012/upload [email protected]~/Desktop/test.png 

Sie Ihre Datenbank überprüfen können, ob die Datei hochgeladen:

$ mongofiles list -d test 
connected to: 127.0.0.1 
test.png 5520 

Sie können es auch erneut herunterladen:

http --download get localhost:3012/download?filename=test.png 
+0

Dies ist genau das, was ich gesucht habe, vielen Dank! Haben Sie zufällig eine Quelle für weitere Dokumentation? – Maarten

+0

Es gibt ein ziemlich nettes Handbuch, wie Streams funktionieren [hier] (https://github.com/substack/stream-handbook). Wenn du eine Idee hast, wie sie funktionieren, denke ich, dass der meiste Code, den ich gepostet habe, einfacher zu verstehen ist :) – robertklep

+3

Danke, das hat mir wirklich geholfen. Auch für diejenigen, die Mongoose verwenden, ist die einzige Änderung, die Sie in den oben genannten vornehmen müssen: var gfs = Grid (db, mongoose.mongo); –

Verwandte Themen