【问题标题】:Storing data stream from POST request in GridFS, express, mongoDB, node.js在 GridFS、express、mongoDB、node.js 中存储来自 POST 请求的数据流
【发布时间】:2014-01-18 13:07:13
【问题描述】:

我正在尝试弄清楚如何将图像直接发布到 GridFS,而无需先将其作为临时文件存储在服务器上的任何位置。

我正在使用 Postman (chrome ext.) 发布文件,并且我设法将这篇文章存储为文件,使用:

req.pipe(fs.createWriteStream('./test.png'));

当从服务器上的文件创建 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 || 3413);

savePic.js:

var savePic = function(req, callback){


var Db = require('mongodb').Db,
    MongoClient = require('mongodb').MongoClient,
    Server = require('mongodb').Server,
    ReplSetServers = require('mongodb').ReplSetServers,
    ObjectID = require('mongodb').ObjectID,
    Binary = require('mongodb').Binary,
    GridStore = require('mongodb').GridStore,
    Grid = require('mongodb').Grid,
    Code = require('mongodb').Code,
    BSON = require('mongodb').pure().BSON,
    assert = require('assert');
    fs = require('fs');

    //When the following 

      //req.pipe(fs.createWriteStream('./test.png'));

    //is not commented out, the correct image is stored to test.png, and 
    //the sequence after req.on("data"... starts
    //(That sequence does not start at all when this is commented out..)

var fileId = new ObjectID();
var db = new Db('testDB', new Server('localhost', 27017));
// Establish connection to db
db.open(function(err, db) {


  var gridStore = new GridStore(db, 'test', 'w');

  //open 
  gridStore.open(function(err, gridStore) {
    console.log("opened");


    req.on("data", function (data) {
        console.log("data recieved");
            gridStore.write(data, function (err, gridStore) {
                if (err) {
                    console.log("error writing file");
                }
            });
        });
     req.on("end", function () {
            gridStore.close(function (err, gridStore) {
                if (!err) {
                    console.log("The file has been stored to database.");
                    db.close();
                }
            });
        });
           req.pipe(gridStore);


      });




});
callback(fileId);
};
module.exports = savePic;

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript node.js mongodb gridfs gridfs-stream


    【解决方案1】:

    gridfs-stream 让这很容易:

    // `gfs` is a gridfs-stream instance
    app.post('/picture', function(req, res) {
      req.pipe(gfs.createWriteStream({
        filename: 'test'
      }));
      res.send("Success!");
    });
    

    【讨论】:

    • 谢谢,这行得通。另外,您能告诉我如何在一个表单中处理“文件类型多个”或多个文件控件。以及如何从帖子中获取原始文件名。
    • @robert,我是 gridfs 的新手。你能告诉我createWriteStream中的文件名是什么吗?如果我想存储字节会怎样?我应该为它创建一个新问题吗?
    • @Java_NewBie 文件名记录在here。基本上,它是您正在创建的 GridFS 文档的(可选)标识符(因此您不仅可以通过其唯一的 _id 属性访问该文档,还可以通过人类可读的字符串访问该文档)。你可以把这个字符串做成你想要的任何东西。
    • @robertklep 谢谢罗伯特。我正在尝试使用上面的代码来存储视频(字节),这将从设备在 gridfs 中发送,并附上您的答案。但我正在努力存储它。我需要一个理解。我已将问题发布在单独的线程上,但有人导航到此链接作为重复。谢谢
    • @robertklep 如何获取存储在回调中的文件的详细信息?谢谢!
    【解决方案2】:

    虽然@robertklep 的回答是正确的,但我想在他的回答中添加一些内容。此代码显示了如何发送回存储文件的元数据。

    app.post('/picture', function(req, res) {
      req.pipe(gfs.createWriteStream({
        filename: 'test'
      }).on('close', function(savedFile){
        console.log('file saved', savedFile);
        return res.json({file: savedFile});
      }));
    })  
    

    【讨论】:

      【解决方案3】:

      这对猫鼬很有效:

       var gfs = Grid(mongoose.connection.db, mongoose.mongo);
          var writeStream = gfs.createWriteStream({
              filename: name,
              mode: 'w',
              content_type: 'video/mp4'
          });
          writeStream.on('close', function() {
              console.log('close event');
          });
      
          fs.createReadStream('uploads/' + name + '/' + name + '.mp4').pipe(writeStream);
          console.log('stream.write: ' + name + '/' + name + '.mp4');
      

      在客户端浏览器上获取视频时,我苦苦挣扎了几天。这就是我到目前为止所尝试的:

      var readstream = gfs.createReadStream({
              filename: file.filename
          });
      
          readstream.on('data', function(data) {
              res.write(data);
              console.log(data);
          });
      
          readstream.on('end', function() {
              res.end();        
          });
      
          readstream.on('error', function (err) {
              console.log('An error occurred!', err);
              throw err;
          });
      

      我在 MongoDB 端的数据如下所示:

      db.fs.chunks.find() { "_id" : ObjectId("5757e76df14741bf0391aaca"), "files_id" : ObjectId("5757e76df14741bf0391aac8"), "n" : 0, "data" : BinData(0,"AAAAIGZ0eXBpc29....

      并且 contentType 是 'video/mp4':

      在浏览器端登录会打印:

      对象 { 0:“�”,1:“�”,2:“�”,3:“”,4:“f”,5:“t”,6:“y”,7:“p ", 8: "i", 9: "s", 85003 更多... }

      有人可以救我的命吗?我希望你不要在这个地方看到我的帖子不方便。

      【讨论】:

        【解决方案4】:

        使用nodejs中的gridfs将txtfile插入mongodb的完整代码。这很好用`

        var mongoose=require("mongoose");
        var gridfsstream=require("gridfs-stream");
        var fs=require("fs");
        mongoose.connect("mongodb://localhost:27017/testimage");
        var conn=mongoose.connection;
        gridfsstream.mongo=mongoose.mongo;
        conn.once("open",function()
        {
            console.log("database connected successfully");
            var gfs=gridfsstream(conn.db);
            var writestream=gfs.createWriteStream({
                filename:"danger.txt"
            });
            fs.createReadStream("sivakasi.txt").pipe(writestream);
            writestream.on("close",function(file)
            {
                console.log(file.filename +"stored successfully into mongodb using gridfs");
            });
            writestream.on("error",function(file)
            {
                console.log(file.filename +"not stored into mongodb using gridfs");
            });
        });
        conn.on("error",function()
        {
            console.log("database not connected try again!!!");
        });

        `

        【讨论】:

          【解决方案5】:

          将图像从 html 发布到 nodejs 的完整代码使用 gridfs 系统将该图像存储在 mongodb 中并在服务器中显示该图像。此代码运行良好。

          var express=require("express");
          var bodyparser=require("body-parser");
          var multer=require("multer");
          var app=express();
          var upload = multer({ dest: '/tmp/'});
          app.use(bodyparser.urlencoded({extended:false}));
          app.post("/uploadimage",upload.single("file"),function(request,response)
          {
              var mongoose=require("mongoose");
              var gridfsstream=require("gridfs-stream");
              var fs=require("fs");
              mongoose.connect("mongodb://localhost:27017/testimage");
              var con=mongoose.connection;
              gridfsstream.mongo=mongoose.mongo;
              con.once("open",function()
              {
                  console.log("test image database connected successfully");
                  var gfs=gridfsstream(con.db);
                  var readstream=fs.createReadStream(request.file.originalname);
                  var writestream=gfs.createWriteStream({
                      filename:"mentorpicthree.jpg"
                  });
                  readstream.pipe(writestream);
                  writestream.on("close",function()
                  {
                      console.log("image stored in mongodb database successfully");
                      fs.readFile(request.file.originalname,function(err,data)
                      {
                          if(err)
                          {
                              response.writeHead(404,{"Content-Type":"text/plain"});
                              console.log("error");
          
                          }
                          else
                          {
                                  response.writeHead(200,{"Content-Type":"image/jpg"});
                                  response.end(data);
                          }
                      });
                  });
                  writestream.on("error",function()
                  {
                      console.log("image not stored in mongodb database");
                  });
          
              });
              con.on("error",function()
              {
                  console.log("database not connected try again!!!");
              });
          
          });
          app.listen(8086,function()
          {
              console.log("server running on port 8086");
          });
          <html>
          <head>
              <title>FILE UPLOAD</title>
          </head>
          <body>
          <p>Ryan Dhal</p>
          <form action="http://127.0.0.1:8086/uploadimage" method="POST" enctype="multipart/form-data">
              <input type="file" name="file">
              <br>
              <input type="submit" value="UPLOAD">
          </form>
          </body>
          </html>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-18
            • 2011-10-26
            • 1970-01-01
            • 2015-09-23
            • 1970-01-01
            • 2020-05-10
            相关资源
            最近更新 更多