2013-05-10 20 views
7

Zacząłem budować API REST za pomocą expressJS. Jestem nowy w węźle, więc proszę o zachowanie mnie. Chcę umożliwić użytkownikom przesyłanie plików bezpośrednio do GridFS Mongo przy użyciu postu do trasy/upload.Przechowuj plik w GridFS Mongo z ExpressJS po przesłaniu

Z tego, co rozumiem w dokumentacji expressJS, po przesłaniu jest dostępny obiekt req.files.image, który zawiera również ścieżkę i atrybut nazwy pliku. Ale jak mogę dokładnie odczytać dane obrazu i zapisać je w GridFS?

Zajrzałem do gridfs-stream, ale nie mogę powiązać końcówek ze sobą. Czy najpierw muszę przeczytać plik, a następnie użyć tych danych do rury przewodowej? Czy mogę po prostu użyć obiektu pliku z wyrażenia i użyć tych atrybutów do skonstruowania skryptu? Wszelkie wskazówki będą mile widziane!

Odpowiedz

29

Oto proste 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); 
}); 

używam httpie załadować plik:

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

Można sprawdzić bazę danych, jeśli plik zostanie dodane:

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

Możesz również pobrać go ponownie:

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

Tego właśnie szukałem, wielkie dzięki! Czy macie przypadkiem jakiekolwiek źródło do dalszej dokumentacji na ten temat? – Maarten

+0

Jest całkiem niezły podręcznik o tym, jak działają strumienie [tutaj] (https://github.com/substack/stream-handbook). Kiedy masz pojęcie o tym, jak działają, myślę, że większość kodu, który zamieściłem, jest łatwiejsza do zrozumienia :) – robertklep

+3

Dziękuję, to mi bardzo pomogło. Również dla tych, którzy używają Mongoose, jedyną zmianą, którą musisz wprowadzić w powyższym jest: var gfs = Grid (db, mongoose.mongo); –