到目前为止,我已经接受了HTML格式的文件,并通过$http.post使用ng-file- upload模块以angular的形式发布了文件。现在,我想在Mongoose中接受此文件,并将其存储到MongoLab上托管的NoSQL MongoDB中。我已经阅读了有关此模块的信息,Multer并遵循了基本文档,但到目前为止,只有我自己。在解释问题的开始之前,让我发布我的代码:
$http.post
ng-file- upload
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); };
控制台日志返回正确的文件对象。
迄今为止的猫鼬:
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的任何体面的文档或存储与我的情况相关的文件的体面的解释。我究竟做错了什么?我应该怎么做呢?
console.log
伙计,您在错误的路径上运行。我已经在您的上一个问题请求中说明了Multer用于将文件保存在文件磁盘系统中,而不是直接保存到数据库中。为此,您必须使用GRIDFS。
来到您当前的问题。
app.post('/Upload', upload.single('solution') ,function (req, res, next) { console.log(req.file); });
在这里,upload.single('solution')-调用函数Upload,传递的文件名是解决方案,但显然它在这里不可用。
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 })
那里的存储部分用于提供必须保存文件的路径,文件名部分用于更改您想要的文件名。
请阅读文档,因为这会有所帮助。当我们使用第三方模块时,我们必须确认他们已经提供的信息,以便我们可以轻松地使用他们的工作。
去检查那个线程。我提出了这个问题-问题是我正在以数组格式发送文件,就像一次发送多个文件一样。如果您不这样做,则只需更改ng-file-upload段以使用单个上载演示示例,并在服务器端将nodejs代码替换.array为.single,那么事情就可以按照您希望它们工作的方式进行-假设您要使用文件磁盘系统存储文件。
.array
.single
我重复说这种方法不会帮助您直接将文件保存在mongodb中。
让我知道您是否需要进一步说明。