【问题标题】:How to store binary data (PNG) in MongoDB via Mongoose?如何通过 Mongoose 在 MongoDB 中存储二进制数据 (PNG)?
【发布时间】:2016-06-19 05:10:45
【问题描述】:

我正在使用这个 yeoman.io 生成器:https://github.com/DaftMonk/generator-angular-fullstack 搭建的 MEAN 堆栈的站点上工作,并且我正在尝试以二进制形式将一些图像文件上传到 MongoDB。这是我的项目的 git 存储库:

https://github.com/peter-atlanta/personal-site

我已经按照 @aheckmann 的 GIST 进行了发球:https://gist.github.com/aheckmann/2408370

但我不断收到关于如何找不到我的文件的错误,即

Error: ENOENT, no such file or directory '../../client/assets/images/github.png'
    at Error (native)
    at Object.fs.openSync (fs.js:500:18)
    at Object.fs.readFileSync (fs.js:352:15)
    at Immediate.<anonymous> (/Users/peterward/petergrayward/blog/server/config/imageToMongo.js:43:21)
    at Immediate._onImmediate    (/Users/peterward/petergrayward/blog/node_modules/mongoose/node_modules/mquery/lib/utils.js:137:16)
    at processImmediate [as _immediateCallback] (timers.js:358:17)

不过,很明显,有问题的 png 位于该目录中,我什至尝试将目录移动到服务器端,但无济于事。

为什么找不到文件/目录入口点?

【问题讨论】:

    标签: mongodb mongoose mean-stack fs node-mongodb-native


    【解决方案1】:

    在 MongoDb 中存储小文件时,许多依赖 Mongoose 的答案也将依赖于使用 GridFS。如果您可以在 MongoDB 中简单地存储文件 不依赖 GridFS 和 Mongoose,那么请尝试以下操作。 (这个答案在我认为更容易阅读的 TypeScript 中,但如果需要,我可以发布转译后的 JavaScript。)

    import mongodb = require("mongodb");
    const URI = 'mongodb://...';
    var dbPromise = new Promise<mongodb.Db>(function (resolve, reject) {
        mongodb.MongoClient.connect(URI, function (err, db) {
            resolve(db);
        });
    });
    import express = require("express");
    var app = express();
    import path = require("path");
    import multer = require("multer");
    var upload = multer({ dest: 'uploads/' });//saving files on filesystem seems to be a requirement
    import fs = require("fs");    
    interface IFile {
        name : string;
        binary : mongodb.Binary;
    }
    
    //<input type="file" type="file" id="png1" name="png1" />
    app.post("/file-upload", upload.single("png1"), function (req, res) {
        let f = req.file;
        fs.readFile(f.path, function (err, buffer) {
                dbPromise.then(db => {
                    let file : IFile = {
                        name: f.originalname,
                        binary: new mongodb.Binary(buffer)
                    };
                    db.collection('files').insertOne(file, function(err, result) {
                        if (err) {
                            res.json(500, err);
                        }
                        console.log(`${result.insertedId} ${result.insertedCount}`);
                    });
                });
            })
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2020-09-25
      • 2011-01-28
      • 1970-01-01
      相关资源
      最近更新 更多