2013-05-10 25 views
7

Tôi đã bắt đầu xây dựng một REST api bằng cách sử dụng expressJS. Tôi mới vào nút vì vậy hãy chịu với tôi. Tôi muốn có thể cho phép người dùng tải tệp trực tiếp lên GridFS của Mongo bằng cách sử dụng bài đăng lên tuyến/tải lên.Lưu trữ tệp trong GridFS của Mongo bằng ExpressJS sau khi tải lên

Từ những gì tôi hiểu trong tài liệu expressJS đối tượng req.files.image có sẵn trong tuyến sau khi tải lên, cũng bao gồm thuộc tính đường dẫn và tên tệp. Nhưng làm thế nào tôi có thể đọc chính xác dữ liệu hình ảnh và lưu trữ nó vào GridFS?

Tôi đã xem xét gridfs-stream nhưng tôi không thể kết thúc với nhau. Trước tiên, tôi có cần đọc tệp và sau đó sử dụng dữ liệu đó cho đường dẫn văn bản không? Hoặc tôi có thể chỉ sử dụng đối tượng tập tin từ thể hiện và sử dụng những thuộc tính để xây dựng một dòng chữ? Bất kỳ con trỏ sẽ được đánh giá cao!

Trả lời

29

Dưới đây là một bản demo đơn giản:

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

tôi sử dụng httpie để tải lên một tập tin:

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

Bạn có thể kiểm tra cơ sở dữ liệu của bạn nếu tập tin được tải lên:

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

Bạn cũng có thể tải xuống lại:

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

Đây chỉ là những gì tôi đang tìm kiếm, cảm ơn rất nhiều! Bạn có, có cơ hội nào, có bất kỳ nguồn tài liệu nào về tài liệu này không? – Maarten

+0

Có một cuốn sổ tay khá đẹp về cách hoạt động của luồng [ở đây] (https://github.com/substack/stream-handbook). Khi bạn có một ý tưởng về cách họ làm việc, tôi nghĩ rằng hầu hết các mã tôi đăng trở nên dễ hiểu :) – robertklep

+3

Cảm ơn bạn, điều này thực sự đã giúp tôi. Ngoài ra, đối với những người sử dụng Mongoose, thay đổi duy nhất bạn cần thực hiện ở trên là: var gfs = Grid (db, mongoose.mongo); –

Các vấn đề liên quan