标签: gridfs-stream

在GridFS,express,mongoDB,node.js中存储来自POST请求的数据流

我试图找出如何将图像直接发布到GridFS而不将其作为临时文件存储在服务器上的任何位置.

我使用Postman(chrome ext.)发布文件,我设法将此帖子存储为文件,使用:

req.pipe(fs.createWriteStream('./test.png'));
Run Code Online (Sandbox Code Playgroud)

当从服务器上的文件创建readStream时,我还能够从readStream直接存储到GridFS.(见代码)

我有以下文件,saveFromReq.js它们监听POST,基本上只是将其传递给savePic.js.

saveFromReq.js:

var express = require('express');
var app = express();
var savePic = require('./savePic');
var fs = require('fs');
var GridStore = require('mongodb').GridStore;
var pic = './square.png';
var picID;



//When the following

 //var pic = fs.createReadStream('./square.png', {autoClose: true});

//is not commented out, and 'req' is replaced with 'pic' in the savePic function,
//the file square.png is stored correctly to GridFS

app.post('/picture', function(req, res){

    savePic(req, function(id){});
    res.writeHead(200, {'Content-Type': 'text' });
    res.end("Sucsess!\n");

});

app.listen(process.env.PORT …
Run Code Online (Sandbox Code Playgroud)

javascript mongodb node.js gridfs gridfs-stream

18
推荐指数
1
解决办法
2万
查看次数

如何将 gridStore 替换为 gridFSBucket?

我有这个错误信息:

(node:11976) DeprecationWarning: GridStore is deprecated, and will be removed in a future version. Please use GridFSBucket instead
Run Code Online (Sandbox Code Playgroud)

有时我无法查看图片,我想正因为如此,由于文档不佳,我不知道如何将我的代码切换到 GridFSBucket,就是这样:

conn.once("open", () => {
  // Init stream
  gfs = Grid(conn.db, mongoose.mongo);
  //gfs = new mongoose.mongo.GridFSBucket(conn.db);
  gfs.collection("user_images");
});


var storageImage = new GridFsStorage({
  url: dbURI,
  options: { useNewUrlParser: true, useUnifiedTopology: true },
  file: (req, file) => {
    return new Promise((resolve, reject) => {
      crypto.randomBytes(16, (err, buf) => {
        if (err) {
          return reject(err);
        }
        const filename = buf.toString("hex") + path.extname(file.originalname);
        const …
Run Code Online (Sandbox Code Playgroud)

node.js gridfs gridfs-stream

12
推荐指数
1
解决办法
2399
查看次数

Node.js文件上传(Express 4,MongoDB,GridFS,GridFS-Stream)

我正在尝试在node.js应用程序中设置文件API.我的目标是能够将文件流直接写入gridfs,而无需最初将文件存储到磁盘.好像我的创建代码正在运行.我能够将文件上传保存到gridfs.问题是正在读取文件.当我尝试通过Web浏览器窗口下载保存的文件时,我看到文件内容包含如下内容:

------WebKitFormBoundarye38W9pfG1wiA100l
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: text/javascript

***File contents here***

------WebKitFormBoundarye38W9pfG1wiA100l--
Run Code Online (Sandbox Code Playgroud)

所以我的问题是在将文件流保存到gridfs之前,我需要做些什么来从文件流中去除边界信息?这是我正在使用的代码:

'use strict';

var mongoose = require('mongoose');
var _ = require('lodash');

var Grid = require('gridfs-stream');
Grid.mongo = mongoose.mongo;
var gfs = new Grid(mongoose.connection.db);

// I think this works. I see the file record in fs.files
exports.create = function(req, res) {
    var fileId = new mongoose.Types.ObjectId();

    var writeStream = gfs.createWriteStream({
        _id: fileId,
        filename: req.query.name,
        mode: 'w',
        content_type: req.query.type,
        metadata: {
            uploadedBy: req.user._id,
        }
    });

    writeStream.on('finish', function() {
        return res.status(200).send({ …
Run Code Online (Sandbox Code Playgroud)

javascript multipartform-data mongodb node.js gridfs-stream

8
推荐指数
1
解决办法
6559
查看次数

GridFS + NodeJS从mongoDB检索图像

我有来自mongoDB的以下带有图像的JSON,但我不知道如何显示它:

fs.chunks:

{
        "_id" : ObjectId("542e684a8a1cec178a172673"),
        "n" : 1,
        "data" : BinData(0,"2N6DSSfbCN/LLacNDYrJUQDEZgimMUwFpQGoJP0RU19Bi4PM82DjrUnKhE/P9v7P8ZveD1oDpFBM0iml9NE3WQmAvYFoG+nhD73Jm4N9b4LpylaAN5Ef+gVdgGSTAfSUwOikXoVick5pSQCkRmTCU5NT9VVfjHdAx74/ZhFRj+TIRjzlAhzkACBElzgMwGCo7tX+FYrpQLJ5KRmXiwFFwsNtHHzXiK1eu+CG1FumhGpA/qdG8CdDgD1xUHEcerMGO/eLGR9ML7ni/VjXxWzqp2j5DG2/WuKNv7xd3Kz/vr0MctJhuaBIl35YrKhdLnzqDa0uDa6bm4jz+eNyAI2hQbayGo4kVPFe8W7wFpY7qfBvnB9kbocxfZSdADDUNwYaydpT8lIcKEN9XfQJOYZvHp0El"),
        "files_id" : ObjectId("542e684a8a1cec178a172671")
}

fs.files:

{
        "_id" : ObjectId("542e65378axdeckhb0"),
        "uploadDate" : ISODate("2012-11-01"),
        "length" : 15673,
        "chunkSize" : 33222,
        "md5" : "f66e6654854a28e3672cfhds334d223b55a1"
}
Run Code Online (Sandbox Code Playgroud)

需要将“数据”转换为真实图像才能显示。

我正在使用nodeJS,但找不到很好的教程来通过GridFS从mongoDB检索图像。

谢谢你的帮助!

mongoose mongodb node.js gridfs gridfs-stream

6
推荐指数
1
解决办法
607
查看次数

gridfs-stream 总是存储带有“contentType: binary/octet-stream”的文件

我正在尝试在 nodejs 中编写一个程序,该程序在 mongodb 中存储文件列表。它工作正常,但有一个问题:它总是将 contentType 元数据存储为二进制/八位字节流,我希望它存储实际的 MIME 类型。我尝试在 readStream 之前获取 mime 类型(通过 promises),但即使我对 contentType 进行硬编码(例如“image/jpeg”),它也总是将元数据保存为“binary/octet-stream。

这是我的代码:

files.forEach(function(f) {

    var conn = mongoose.createConnection(db);

    conn.once('open', function () {
      var gfs = Grid(conn.db);
      var writeStream = gfs.createWriteStream({
        filename: f.location,
        mode: 'w',
        contentType: 'image/jpeg'
      });

      writeStream.on('finish', function() {
          console.log('Storing', f.location, 'OK');
          return;
      })
      .on('error', function(data) {
          console.log('Error', f.location, data) 
      });

      fs.createReadStream(path.join(__dirname, 'files', f.location), 'utf-8')
      .pipe(writeStream);

    });
});
Run Code Online (Sandbox Code Playgroud)

任何的想法?谢谢您的反馈!

mongodb node.js gridfs mime-types gridfs-stream

5
推荐指数
1
解决办法
2107
查看次数

使用mongoose,gridfs-stream和multer上传文件时出现MongoError

我运行Express 4的使用multer,GridFS的流猫鼬用MongoDB中,我尝试上传的文件,并将其流式传输到GridFS的.

执行此操作的快速路由定义为:

app.post('/uploadfile', function (req, res) {
    console.dir(req.files);

    // The mongodb instance created when the mongoose.connection is opened
    var db = mongoose.connection.db;

    // The native mongo driver which is used by mongoose
    var mongoDriver = mongoose.mongo;

    // Create a gridfs-stream
    var gfs = new Gridfs(db, mongoDriver);

    var file = req.files.myFile;

    var fileId = new ObjectId();

    console.log("Creating WriteStream");
    var writeStream = gfs.createWriteStream({
        _id: fileId,
        filename: file.originalname,
        mode: 'w',
        content_type: file.mimetype,
        metadata: {
            id: '123', …
Run Code Online (Sandbox Code Playgroud)

mongoose node.js node-mongodb-native gridfs-stream multer

3
推荐指数
1
解决办法
3564
查看次数

使用 gridfs-stream 执行 find() 时如何指定 GridFS 存储桶

使用gridfs-stream,查找和获取文件时如何指定bucket名称?

我的问题是在如何指定 GridFS 存储桶的stackoverflow 上找到的以下问题的后续问题

那里的解决方案提供了一个示例,说明如何在调用 createWriteStream 时指定存储桶。根据@vsivsi 提供的代码,我可以使用以下代码中的“root”选项将文件添加到我的自定义存储桶中:

// fyi, req.file has been populated using multer
var gfs = Grid(mongoose.connection.db);
var writeStream = gfs.createWriteStream({
    filename: req.file.originalname,
    mode: 'w',
    content_type: req.file.mimetype,
    root: 'private'
});
Run Code Online (Sandbox Code Playgroud)

这成功地将我的文件添加到 private.files 和 private.chunks。所以现在我想查找并阅读我上传的文件。我的 find() 不使用存储桶,如下所示:

var gfs = Grid(mongoose.connection.db);
gfs.find({
    filename: req.params.filename
}).toArray(function(err, files){ 
     // bunch of processing here... 
});
Run Code Online (Sandbox Code Playgroud)

现在我如何知道要查询哪个存储桶/根?

我假设在调用 createReadStream() 时我将能够使用相同的“root”选项,但首先我需要找到它。有没有办法告诉 gridfs-stream 使用哪个存储桶/根?

javascript bucket mongodb gridfs gridfs-stream

2
推荐指数
1
解决办法
1735
查看次数