在Mongoose中使用Multer将文件存储到MongoDB中
Storing a file into MongoDB using Multer in Mongoose
到目前为止,我已经接受了HTML表单中的一个文件,并使用ng-file-upload
模块通过$http.post
以angular形式发布。现在我想在Mongoose中接受这个文件,并将其存储到我的NoSQL MongoDB中,该数据库托管在MongoLab上。我读过这个名为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>
我的角度代码:
$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);
};
控制台日志返回正确的文件对象。
迄今为止的Mongoose:
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文档,也找不到与我的情况相关的存储文件的合适解释。我做错了什么?我该怎么办?
伙计,你跑错了路。我已经在您之前的问题请求中解释过,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在通过ng文件上传上传文件时抛出奇怪错误
去检查那个线程。我提出了这个问题——问题是我以数组格式发送文件,就像同时发送多个文件一样。如果你不这样做,只需将ng文件上传段更改为使用单个上传演示示例,并且在服务器端nodejs代码将.array
替换为.single
,事情就会按照你希望的方式工作——假设你想使用文件磁盘系统来存储文件。
我重复一遍,这种方法不会帮助您直接将文件保存在mongodb中。
如果你需要进一步澄清,请告诉我。
经过一番研究,我找到了问题的答案。我现在可以将文件存储到我的MongoDB中了。对于那些感兴趣的人,我在下面发布我的Mongoose代码,并附上一个小的描述。
首先安装此操作所需的程序包。我用了以下
npm安装--保存强大的
npm安装--保存gridfs
npm安装--保存fs
这些是我使用的软件包(Formidable、gridfs和fs)。这是对我来说与这个特定表单和请求相关的完整的mongoose代码。
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.file包含正确的数据。因此,对于那些有这个问题的人来说,这是一个解决方案http://excellencenodejsblog.com/gridfs-using-mongoose-nodejs/帮了我很多忙。既然我已经完成了这项工作,我还想把文件从mongoDB下载到我电脑上的一个选定目录上,有人能给我答案吗?或者这和创建一个文件系统的读流一样简单?
- 将图像文件存储在猫鼬模式中的二进制数据中,并以html形式显示图像
- 在使用java使用dropbox选择器从dropbox中提取文件后,如何将文件存储在服务器中
- 如何使用 jQuery 动态更改视频,其中源路径存储在数据库中,文件存储在文件系统中
- rails_admin的 css 和 javascript 文件存储在哪里
- 如果我的文本文件存储在服务器中,如何在 javascript 中读/写文本文件
- HTML5应用程序缓存文件存储在客户端的位置
- 将 Json 文件存储在 AngularJS 变量中,以便与“ng-repeat”一起使用
- 将角度文件存储在轨道中的最佳位置
- 在Mongoose中使用Multer将文件存储到MongoDB中
- 将文件存储在Firebase存储中
- Glassfish/Java/JS:将图像文件存储到servlet中,并将其检索到网页中
- Webaudio API:将数组缓冲区作为文件存储在服务器上,稍后检索
- 将值从文本文件存储到数组中
- Nodejs:在一个新窗口中写入zip文件(存储在一个变量中作为Buffer)
- 如何使用 JavaScript 将 JSON 数据从远程 URL 读取到本地文件存储中的文件
- 哪个更省时?文件存储或SQLite
- 将javascript数组作为csv文件存储在服务器上
- 在数据库中插入clob数据或所有类型的文件存储
- HTML5 - Web SQL数据库文件存储和所有表创建的地方
- 打开一个javascript对话框,将完整的文件存储到一个var中