Nodejs 应用gridfs-stream模块上传图片到mongodb数据库

Nodejs 应用gridfs-stream模块上传图片到mongodb数据库

var mongoose = require(‘mongoose’); var Grid = require(‘gridfs-stream’); var async = require(‘async’); var gfs = Grid(mongoose.connection.db, mongoose.mongo); var GridFile = require(’…/…/models/gridfs’).GridFile;

var put_save = function(req, res) { var fnames = util.isArray(req.files.fname) ? req.files.fname : [req.files.fname]; async.map(fnames, process_file, function(err, results) { res.json({ ‘err’: err, ‘results’: results }) })

function process_file(fname, callback) {
    var gfs_options = {
        filename: fname.name,
        mode: 'w',
        content_type: fname.type,
        metadata: {
            'client': req.user.client.id,
            'user': req.user.id
        }
    };
    var writestream = gfs.createWriteStream(gfs_options);
    fs.createReadStream(fname.path).pipe(writestream);
    writestream.on('close', function(file) {
        fs.unlink(fname.path, function(err) {
            if (err) {
                return callback(err, null);
            };
            callback(null, file)
        });
    });

}

}


4 回复

Node.js 应用 gridfs-stream 模块上传图片到 MongoDB 数据库

在本教程中,我们将介绍如何使用 Node.js 和 gridfs-stream 模块将图片文件上传到 MongoDB 数据库。这将包括安装必要的依赖项、配置连接以及实现文件上传逻辑。

安装依赖项

首先,确保你已经安装了以下依赖项:

npm install mongoose gridfs-stream multer
  • Mongoose:用于连接和操作 MongoDB。
  • gridfs-stream:用于通过流式接口与 MongoDB 的 GridFS 进行交互。
  • Multer:一个 Node.js 中间件,用于处理 multipart/form-data,主要用于上传文件。

配置连接

接下来,配置 Mongoose 连接到 MongoDB,并初始化 gridfs-stream

const mongoose = require('mongoose');
const Grid = require('gridfs-stream');
const GridFile = require('./models/gridfs').GridFile; // 假设你有一个 GridFile 模型

// 连接 MongoDB
mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 初始化 gridfs-stream
let gfs;
mongoose.connection.once('open', () => {
  gfs = Grid(mongoose.connection.db, mongoose.mongo);
});

实现文件上传逻辑

现在我们来实现文件上传逻辑。我们将使用 Multer 来处理文件上传请求:

const express = require('express');
const multer = require('multer');
const fs = require('fs');
const async = require('async');

const app = express();
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.array('files'), (req, res) => {
  let fnames = Array.isArray(req.files) ? req.files : [req.files];

  async.map(fnames, processFile, (err, results) => {
    res.json({
      err: err,
      results: results
    });
  });
});

function processFile(file, callback) {
  const gfsOptions = {
    filename: file.originalname,
    mode: 'w',
    content_type: file.mimetype,
    metadata: {
      client: req.user.client.id,
      user: req.user.id
    }
  };

  const writeStream = gfs.createWriteStream(gfsOptions);
  fs.createReadStream(file.path).pipe(writeStream);

  writeStream.on('close', (file) => {
    fs.unlink(file.path, (err) => {
      if (err) {
        return callback(err, null);
      }
      callback(null, file);
    });
  });
}

app.listen(3000, () => console.log('Server running on port 3000'));

解释

  1. 配置连接

    • 使用 Mongoose 连接到 MongoDB。
    • 初始化 gridfs-stream 以便我们可以使用它来读写文件。
  2. 文件上传逻辑

    • 使用 Multer 处理文件上传。
    • 将上传的文件保存到临时目录(例如 uploads/)。
    • 使用 async.map 并行处理每个上传的文件。
    • 创建一个 writeStream 并将上传的文件流写入 MongoDB。
    • 在文件写入完成后删除临时文件。

通过上述步骤,你可以使用 Node.js 和 gridfs-stream 模块将图片文件上传到 MongoDB 数据库。


这个包的作用式直接把文件以流的方式上传到mongo吗?

如果我要直接上传下载一个buffer数据呢,怎么操作????

为了将图片上传到MongoDB数据库中,我们可以使用gridfs-stream模块。下面是一个简单的示例代码,展示了如何实现这一功能。

示例代码

首先,确保安装了所需的依赖包:

npm install mongoose gridfs-stream multer

接下来是代码部分:

const mongoose = require('mongoose');
const Grid = require('gridfs-stream');
const multer = require('multer');
const fs = require('fs');

// 连接到MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 初始化gfs
let gfs;
mongoose.connection.once('open', () => {
  gfs = Grid(mongoose.connection.db, mongoose.mongo);
});

// 设置Multer以处理文件上传
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname);
  }
});

const upload = multer({ storage: storage });

// 处理上传的文件
app.post('/upload', upload.single('file'), (req, res) => {
  const file = req.file;
  
  const writeStream = gfs.createWriteStream({
    filename: file.originalname,
    mode: 'w',
    content_type: file.mimetype,
    metadata: {
      client: req.user.client.id,
      user: req.user.id
    }
  });
  
  fs.createReadStream(file.path).pipe(writeStream);

  writeStream.on('close', (file) => {
    fs.unlink(file.path, (err) => {
      if (err) {
        return res.status(500).send(err);
      }
      res.status(200).json({ message: 'File uploaded successfully' });
    });
  });
});

解释

  1. 连接到MongoDB:使用mongoose连接到MongoDB数据库。
  2. 初始化gfs:当Mongoose连接打开后,初始化gridfs-stream
  3. 设置Multer:使用Multer来处理文件上传,设置存储策略。
  4. 处理上传的文件
    • 使用Multer的upload.single('file')中间件处理单个文件上传。
    • 创建一个writeStream用于将文件写入GridFS。
    • 使用fs.createReadStream读取临时文件并将其写入GridFS。
    • 在文件写入完成后删除临时文件,并返回成功消息。

这样,你就可以通过这个API接口上传图片到MongoDB的GridFS中了。

回到顶部