Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用Express将文件上载保存到Mongo DB_Node.js_Mongodb_File Upload_Express - Fatal编程技术网

Node.js 使用Express将文件上载保存到Mongo DB

Node.js 使用Express将文件上载保存到Mongo DB,node.js,mongodb,file-upload,express,Node.js,Mongodb,File Upload,Express,接下来,我用文件输入创建了一个表单,将文件上传到指定目录。这很好,但它不会将任何内容保存到数据库中,我也没有任何关于上传到Jade模板中显示的文件的参考 以下是我正在做的: // add new bulletin exports.addbulletin = function(db) { return function(req, res) { var tmp_path = req.files.coverimage.path; // set where th

接下来,我用
文件
输入创建了一个表单,将文件上传到指定目录。这很好,但它不会将任何内容保存到数据库中,我也没有任何关于上传到Jade模板中显示的文件的参考

以下是我正在做的:

// add new bulletin
exports.addbulletin = function(db) {
    return function(req, res) {

        var tmp_path = req.files.coverimage.path;
        // set where the file should actually exists - in this case it is in the "images" directory
        var target_path = './public/uploads/' + req.files.coverimage.name;
        // move the file from the temporary location to the intended location
        fs.rename(tmp_path, target_path, function(err) {
            if (err) throw err;
            // delete the temporary file, so that the explicitly set temporary upload dir does not get filled with unwanted files
            fs.unlink(tmp_path, function() {
                if (err) throw err;
                res.send('File uploaded to: ' + target_path + ' - ' + req.files.coverimage.size + ' bytes');
            });
        });

        // Submit to the DB
        collection.insert(req.body, function (err, data) {
            if (err) {
                res.send("There was a problem adding the information to the database.");
            }
            else {
                res.location("index");
                res.redirect("/");
            }
        });

    }
};
第二部分是将
req.body
(非文件输入的其他表单字段)插入Mongo数据库。我只想把
req.files
和插入
req.body
的位置放在一起,但这不起作用

我想,我的困惑也在于Mongo的工作方式。我不是数据库专家,但当你“上传”一张图片时,实际的图片文件应该进入数据库,还是应该仅仅添加一个引用(比如图片名称和在应用程序中的位置)

总之,我只想将上传的图像(或对它的引用)保存到Mongo数据库中,这样我就可以在Jade模板中引用它并显示给用户

值得一提的是,以下是表单的相关部分(使用翡翠制作模板):

更新

我忘了加上我正在使用


好的,下面的教程使用的示例是从上传中获取临时文件信息,然后将该文件移动到另一个位置

因此,您的代码中有
target\u path
变量,它显示了在磁盘上查找文件的位置。因此,如果您想存储一个引用,那么您就有了它,以后读取您的mongo文档时会有该路径信息,这样您就可以再次访问该文件

正如您所说的,您可能不希望传递整个
res.body
,而只是像这样访问它的属性,并构建您自己的文档,在其中插入/更新任何内容。有关访问
文件
中信息的信息,请参阅

如果您决定将文件内容放入mongo文档中,那么只需在中读取文件内容即可。这里的操作员核心节点文档可能对您有所帮助。特别是功能

从MongoDB的角度来看,您只需将该内容添加到任何文档字段中,它不会关心和处理二进制类型。前提是您的大小低于16MB BSON限制


超过这个限度,你可能会感兴趣。还有一个供参考的,它可能会为您提供一些关于如何做到这一点的见解。

谢谢您的回答。因此,关于使用
target\u path
变量,您提出了一个有趣的观点。后来我添加了像这样的
collection.insert((req.body,target_path),function(err,data){…}
,如果我只上传一个图像(没有其他内容),它似乎可以保存。这样做正确吗?我的意思是我意识到我可以“insert”一个有我选择的字段的对象,但是我真的想用
req.body
来捕获它们加上文件输入。不明白你的意思。你认为你想存储req.body的全部内容为什么?你认为你在存储什么?你的用法也是错误的。
target\u path
只是变量中的一个字符串。你需要一个object.Ignor现在,这将是一个简单的文档
.insert({“filename”:target_path})
很难解释为什么我需要存储
req.body
的全部内容,但本质上是因为我无法判断需要添加哪些字段。它们可以通过jQuery动态添加和删除(不幸的是,这是一个超级黑客…。谢谢你指出我愚蠢的
target\u path
是一个字符串而不是一个对象:)好吧,我不会这样做,但每个对象都有自己的,但当然你只能传入一个对象,所以选择一个属性并将文件名添加到其中。
req.body.myfilename=target_path;
然后你可以传入
req.body
以插入.Perfect。谢谢!我知道,这是我做的第一个node.js应用程序,所以我学到了很多,但只是我想先完成这件事,然后用帆重新开始。
form.new-bulletin(name="addbulletin", method="post", enctype="multipart/form-data", action="/addbulletin")
  input(type="file", name="coverimage")
multipart = require("connect-multiparty"),
multiparty = multipart();
app.post("/addbulletin", multiparty, routes.addbulletin(db));