Tom*_*ans 5 javascript mongoose mongodb node.js angularjs
我已经到目前为止接受了我的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>
Run Code Online (Sandbox Code Playgroud)
我的角色代码:
$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);
};
Run Code Online (Sandbox Code Playgroud)
控制台日志返回正确的文件对象.
到目前为止猫鼬:
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);
});
Run Code Online (Sandbox Code Playgroud)
这console.log使得返回undefined.所以,某个地方出现了严重错误.请帮帮我!我希望在我的Mongoose中接收这个文件并将其存储到MongoDB中,我以前从未这样做过,似乎找不到任何适合Multer的文档或任何适当的解释来存储与我的案例相关的文件.我究竟做错了什么?我应该做什么呢?
男人你在错误的道路上奔跑.我已在前一个问题请求中解释过Multer用于将文件保存在文件磁盘系统中而不是直接保存到数据库中.为此,您必须使用GRIDFS.
来到你当前的问题.
app.post('/Upload', upload.single('solution') ,function (req, res, next) {
console.log(req.file);
});
Run Code Online (Sandbox Code Playgroud)
这里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 })
Run Code Online (Sandbox Code Playgroud)
存储部件用于提供必须保存文件的路径,文件名部分用于更改您希望拥有的文件名.
请阅读文档,因为这会有所帮助.当我们使用第三方模块时,我们必须承认他们已经提供的信息,以便我们可以轻松地使用他们的工作.
让我让你更轻松.这是现成的代码,可以工作.
通过ng-file upload上传文件时,Multer抛出了奇怪的错误
去检查那个线程.我提出了这个问题 - 问题在于我是以数组格式发送文件,就像在多个文件中一样.如果您不这样做,只需更改ng-file-upload段以使用单个上载演示示例,并在服务器端nodejs代码替换为.array,.single并且事情将以您希望它们工作的方式工作 - 假设您要使用文件磁盘系统存储文件.
我再说一遍,这个方法不会帮助你直接在mongodb中保存文件.
如果您需要进一步澄清,请与我们联系.
经过一番研究,我找到了问题的答案。我现在可以将文件存储到我的 MongoDB 中。对于那些感兴趣的人,我将在下面发布我的 Mongoose 代码并附上简短的描述。
首先安装此操作所需的软件包。我用了以下这些
npm install --save 强大
npm install --保存 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');
});
});
Run Code Online (Sandbox Code Playgroud)
这对我有用!现在,我查看 MongoLab 上托管的 mongoDB,发现 fs.chunks 和 fs.files 集合已创建,并且 fs.files 包含正确的数据。因此,对于那些遇到这个问题的人来说,这是一个解决方案, http://excellencenodejsblog.com/gridfs-using-mongoose-nodejs/上的文档对我帮助很大。现在我已经完成了这项工作,我还想将文件从 mongoDB 下载到我的电脑上选定的目录中,有谁可以给我答案吗?或者就像创建文件系统的读取流一样简单?
| 归档时间: |
|
| 查看次数: |
12661 次 |
| 最近记录: |