使用Mongoose中的Multer将文件存储到MongoDB中

时间:2016-01-03 12:26:29

标签: javascript angularjs node.js mongodb mongoose

我已经到目前为止接受了我的HTML表单中的文件,并使用$http.post模块通过ng-file-upload以角度发布。现在我想在Mongoose中接受这个文件并将其存储到我在MongoLab上托管的NoSQL MongoDB中。 我已经阅读了关于这个名为Multer的模块并且遵循了基本文档,但它只是我到目前为止。在我解释问题的开头之前,让我发布我的代码:

我的HTML表单:

<form name="upForm">
   <fieldset>
      <legend>Upload files here</legend>
         <label>Insert File Here:</label>
         <input type="file" ngf-select ng-model="exFile" name="file" ngf-accept="'.cs'" required>
         <i ng-show="upForm.file.$error.required">*required</i>
         <div class="alert" ng-show="file.$error === 'pattern'">
              file type is not accepted
         </div>
         <br />
         <button ng-disabled="!upForm.$valid" ng-click="uploadExercise(exFile)" class="btn btn-default">Submit</button>
         <span class="progress" ng-show="picFile.progress >= 0">
         <div style="width:{{exFile.progress}}%" ng-bind="picFile.progress + '%'"></div>
         </span>
         <span ng-show="picFile.result">Upload Successful</span>
    </fieldset>
</form>

My Angular Code:

 $scope.uploadExercise = function (file) {

    console.log(file);
    var fd = new FormData();
    fd.append('file', file);
    $http.post(url+"/Upload", fd,{
        transformRequest: angular.identity,
        header:{'Content-Type': undefined},
        enctype:'multipart/form-data'
    }).success(function () { }).error(function () { });
    console.log(fd);
};

控制台日志返回正确的文件对象。

迄今为止的猫鼬:

var mongoose = require("mongoose");
var express = require("express");
var multer = require('multer');
var upload = multer({ dest: 'Uploads/' });
var bodyparser = require("body-parser");
var app = express();


mongoose.connect("connection-string");
app.use(bodyparser.json());

app.post('/Upload', upload.single('solution') ,function (req, res, next) {
    console.log(req.file);
});

console.log不断返回undefined。所以,某个地方出现了严重错误。请帮帮我! 我希望在我的Mongoose中接收这个文件并将其存储到MongoDB中,我以前从未这样做过,并且似乎找不到任何适合Multer的文档或任何适当的解释来存储与我的案例相关的文件。我究竟做错了什么?我应该做什么呢?

2 个答案:

答案 0 :(得分:5)

你正在走错路的人。我已在前一个问题请求中解释过Multer用于将文件保存在文件磁盘系统中而不是直接保存到数据库中。为此,您必须使用GRIDFS。

来到你当前的问题。

app.post('/Upload', upload.single('solution') ,function (req, res, next) {
    console.log(req.file);
});

这里upload.single('solution') - 调用一个函数上传,传递的文件名是解决方案,但很明显它在这里不可用。

使用这种格式--Multer的文档

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
})

var upload = multer({ storage: storage })

存储部件用于提供必须保存文件的路径,文件名部分用于更改您希望拥有的文件名。

请阅读文档,因为这会有所帮助。当我们使用第三方模块时,我们必须承认他们已经提供的信息,以便我们可以轻松地使用他们的工作。

让我让你更轻松。这是现成的代码,可以工作。

Multer throwing weird error while uploading file via ng-file upload

去检查那个帖子。我提出了这个问题 - 问题在于我是以数组格式发送文件,就像在多个文件中一样。如果您不这样做,只需更改ng-file-upload段以使用单个上载演示示例,并在服务器端nodejs代码将.array替换为.single,事情将按您希望的方式工作 - 假设您想使用文件磁盘系统来存储文件。

我再说一遍,这个方法不会帮助你直接在mongodb中保存文件。

如果您需要进一步澄清,请与我们联系。

答案 1 :(得分:3)

经过一番研究,我找到了问题的答案。我现在能够将文件存储到我的MongoDB中。对于那些感兴趣的人,我在下面用一个小描述发布我的Mongoose代码。

首先安装此操作所需的软件包。我使用了以下的

  

npm install --save formidable

     

npm install --save gridfs

     

npm install --save fs

这些是我使用的包(Formidable,gridfs和fs)。 这是与我特定的表格和请求相关的全功能猫鼬代码。

var mongoose = require("mongoose");
var express = require("express");
var formidable = require("formidable");
var fs = require("fs");
var grid = require("gridfs-stream");
var bodyparser = require("body-parser");
var app = express();

mongoose.connect("**fill in your connection-url here**");
var conn = mongoose.connection;

app.use(bodyparser.json());

app.post('/Upload', function (req, res) {
    var form = new formidable.IncomingForm();
    form.uploadDir = __dirname+"/Uploads";
    form.keepExtensions = true;
    form.parse(req, function (err, fields, files) {
        if (!err) {
            console.log('Files Uploaded: ' + files.file)
            grid.mongo = mongoose.mongo;
            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 check fs.files & fs.chunks in mongodb');
    });
});
这对我有用!我现在去查看我在MongoLab上托管的mongoDB,看看fs.chunks和fs.files集合是否已创建,fs.files包含正确的数据。 所以对于那些有这个问题的人来说,这是一个解决方案,http://excellencenodejsblog.com/gridfs-using-mongoose-nodejs/上的文档对我帮助很大。现在我有这个工作,我也想将文件FROM mongoDB下载到我电脑上的一个选定目录,是否有人可以给我答案?或者就像创建文件系统的读取流一样简单?