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

Javascript 使用Mongoose中的Multer将文件存储到MongoDB中,javascript,angularjs,node.js,mongodb,mongoose,Javascript,Angularjs,Node.js,Mongodb,Mongoose,我已经接受了一个HTML格式的文件,并通过$http.post使用ng file upload模块通过angular发布。现在我想在Mongoose中接受这个文件,并将其存储到MongoLab上托管的NoSQL MongoDB中。 我已经阅读了名为Multer的模块,并遵循了基本文档,但到目前为止,它只对我有用。在我解释问题的开始之前,让我发布我的代码: 我的HTML表单: <form name="upForm"> <fieldset> <leg

我已经接受了一个HTML格式的文件,并通过
$http.post
使用
ng file upload
模块通过angular发布。现在我想在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>
控制台日志返回正确的文件对象


迄今为止,猫鼬:

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的任何像样的文档或任何像样的解释来存储与我的案例相关的文件。我做错了什么?我该怎么办呢?

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

回到你现在的问题

app.post('/Upload', upload.single('solution') ,function (req, res, next) {
    console.log(req.file);
});
这里的
upload.single('solution')
-调用一个函数upload,传递的文件名是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 })
其中的存储部分用于指定必须保存文件的路径,文件名部分用于更改您想要的文件名

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

让我让你更容易些。下面是现成的代码

去检查那根线。这个问题是我提出的——问题是我以数组格式发送文件,就像一次发送多个文件一样。如果不这样做,只需将ng file upload segment更改为使用single upload演示示例,并在服务器端将nodejs代码替换为
。array
。single,然后事情将按照您希望的方式工作-假设您希望使用文件磁盘系统存储文件

我再说一遍,这种方法不能帮助您直接将文件保存在mongodb中


如果您需要进一步的澄清,请告诉我

经过一些研究,我找到了问题的答案。我现在可以将文件存储到我的MongoDB中了。对于那些有兴趣的人,我将在下面发布我的猫鼬代码,并附上一个小说明


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

npm安装--节省资源

npm安装--保存gridfs

npm安装--保存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');
    });
});
这对我有用!现在,我查看了mongoDB上托管的mongoDB,发现创建了fs.chunk和fs.files集合,并且fs.files包含正确的数据。
因此,对于那些有这个问题的人来说,这是一个解决方案,有关的文档对我帮助很大。现在我有了这个工作,我还想从mongoDB下载文件到我电脑上的一个选定目录,有人能给我答案吗?或者这就像创建一个文件系统的readstream一样简单?

我理解其中的区别:)谢谢!我还可以使用Multer将我要从mongoDB“下载”/“读取”的文件存储到所选目录中吗?您想在从mongoDB检索文件后将其保存在文件磁盘系统中吗?确切地说。我注意到在我的代码中,GridFS将把我的文件保存到一个目录
form.uploadDir=\uuu dirname+“/Uploads”然后将其流式传输到MongoDB。但我想知道如何从mongoDB接收文件并将其存储到目录中。另外,您知道如何在writestream完成后清除此目录,否则此目录将包含上载的文件,对吗?如果您使用GRID FS保存文件,为什么要将其保存到其他任何位置。老实说,我并没有在文件系统中使用NodeJS自动删除节。但我可以提出一个替代方案。您可以创建每天运行的cron作业,并在服务器上使用linux命令清除特定部分。我正在对您之前的查询进行一些研究,如果我发现了什么,我会告诉您。him*=it-在上面的评论中,既然fs是NodeJS的核心模块,您如何安装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');
    });
});