使用Mongoose将文件存储在MongoDB中

8
我是一个有用的助手,可以翻译文本。

我刚开始学习使用node和mongoDB。我正在使用nodeJS、express和mongoDB开发一个应用程序。我想从文件输入字段中读取一个csv/xlsx文件,并使用mongoose将其存储在mongoDB中。我遇到了一些困难。我在前端使用angularjs。有人能给我建议,我应该经过什么程序吗?具体的代码将是很大的帮助。

我使用busboy模块将文件存储在特定的文件夹中。这是我的代码

在路由中:

router.post('/fileupload', function (req, res) {
    var fstream;
    req.pipe(req.busboy);
    console.log(req.pipe);
    console.log(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log("Uploading: " + filename);
        fstream = fs.createWriteStream('./files/' + filename);
        file.pipe(fstream);
        fstream.on('close', function () {
            res.redirect('back');
        });
    });
});

以及我的前端:

<form method="post" action="/fileupload" enctype="multipart/form-data">
    <input type="file" id="file" name="file">
    <button type="submit">Submit</button>
</form>

到目前为止还没有错误。现在我只想将这些文件存储在数据库中。接下来我该怎么做?
1个回答

9

您可能需要了解在Mongo中存储文件的基础知识。为什么要将文件存储在Mongo中,以及它们是如何存储的?

根据您的需求,现在您需要一个mongoose插件,可以将上传的文件存储到Mongo GridFS中。GridFS在这里:http://docs.mongodb.org/manual/core/gridfs/。您可以使用任何兼容的驱动程序来访问网格 - mongoose和mongoose插件gridfs-stream是一个例子 - 请参见此处:https://www.npmjs.org/package/gridfs-stream

我已经使用以下内容将文件保存到gridfs中。

var express = require('express');
var formidable = require('formidable');
var mongoose = require('mongoose');
var grid = require('gridfs-stream');
var fs = require('fs');
var util = require('util');
var app = express();

app.post('/fileupload', function (req, res) {
    var form = new formidable.IncomingForm();
    form.uploadDir = __dirname + "/data";
    form.keepExtensions = true;
    form.parse(req, function(err, fields, files) {
        if (!err) {
          console.log('File uploaded : ' + files.file.path);
          grid.mongo = mongoose.mongo;
          var conn = mongoose.createConnection('..mongo connection string..');
          conn.once('open', function () {
          var gfs = grid(conn.db);
          var writestream = gfs.createWriteStream({
              filename: files.file.name
          });
          fs.createReadStream(files.file.path).pipe(writestream);
       });
     }        
   });
   form.on('end', function() {        
       res.send('Completed ..... go and check fs.files & fs.chunks in  mongodb');
   });

});

app.get('/', function(request, response){
    response.send(
        '<form method="post" action="/fileupload" enctype="multipart/form-data">'
        + '<input type="file" id="file" name="file">'
        + '<input type="submit" value="submit">'
        + '</form>'
        );    
});

app.listen(40000, function() {
    console.log('Express is listening on port 40000');
});

以上是上传文件后应该如何进行的指南,不是一个可以直接投入生产的概念验证。请注意,由于个人喜好,我用 formidable 代替了 busboy。

这对你有帮助吗?

SO1


1
谢谢@SO1的帮助,但我使用了不同的方法来解决这个问题......你的答案给了我一个起点。 - ishakya
2
@ishakya 能分享一下你做了什么吗?我目前也想做类似的事情。 - Florian Wendelborn
@Dodekeract:最终我使用busboy将文件存储在文件夹结构中,如上面的代码所示。之后,在将文件插入数据库时,我使用fs.readFileSync(filepath)从给定的文件路径中存储文件到MongoDB中。 - ishakya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接