【问题标题】:Storing a file into MongoDB using Multer in Mongoose在 Mongoose 中使用 Multer 将文件存储到 MongoDB
【发布时间】:2016-04-07 04:49:54
【问题描述】:

到目前为止,我已经接受了我的 HTML 表单中的文件,并使用 ng-file-upload 模块通过 $http.post 以角度发布。现在我想在 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>

我的 Angular 代码:

 $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 不断返回未定义。所以某事,某处出了大错。请帮帮我! 我想在我的 Mongoose 中接收此文件并将其存储到 MongoDB 中,我以前从未这样做过,并且似乎无法找到 Multer 的任何体面的文档或任何体面的解释来存储与我的案例相关的文件。我究竟做错了什么?我应该怎么做?

【问题讨论】:

    标签: javascript angularjs node.js mongodb mongoose


    【解决方案1】:

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


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

    npm install --save 强大

    npm install --save gridfs

    npm install --save fs

    这些是我使用的包(强大的、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/ 上的文档帮助了我很多。现在我有了这个工作,我还想将文件从 mongoDB 下载到我电脑上的选定目录中,有没有人可以给我答案?还是就像创建一个文件系统的读取流一样简单?

    【讨论】:

    • fs 是 NodeJS 的核心模块,怎么安装?
    【解决方案2】:

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

    回答您当前的问题。

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

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

    使用这种格式 - 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 中。

    如果您需要任何进一步的说明,请告诉我。

    【讨论】:

    • 我明白其中的区别 :) 谢谢!我还可以使用 Multer 将我想从我的 mongoDB 中“下载”/“读取”的文件存储到选定的目录中吗?
    • 您想在从 Mongo DB 检索文件后将文件保存在文件磁盘系统中吗?
    • 完全正确。我注意到在我的代码中,GridFS 会将我的文件保存到目录form.uploadDir = __dirname+"/Uploads"; 中,然后再将其流式传输到 MongoDB。但我想知道如何从 mongoDB 接收文件并将其存储到目录中。另外,你知道写流完成后如何清除这个目录,否则这个目录会被上传的文件打包吧?
    • 如果您使用 GRID FS 来保存文件,为什么要将他保存在其他任何地方。老实说,我没有在文件系统中使用节点 js 自动删除部分。但我可以建议一种替代方案。您可以制作一个每天都会运行的 cron 作业,并在您的服务器上使用 linux 命令,您可以清除特定部分。我正在对您之前的查询进行一些研究,如果我发现了什么,我会通知您。
    • 他* = 它 - 在上面的评论中
    猜你喜欢
    • 2015-01-25
    • 2013-10-27
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多