Stockage du flux de données à partir de la requête POST dans GridFS, express, mongoDB, node.js

j'essaye de comprendre comment je peux poster une image directement sur GridFS sans la stocker sur le serveur en tant que fichier temporaire en premier.

j'utilise Postman (chrome ext.) pour publier un fichier, et j'ai réussi à stocker ce post comme un fichier à l'aide de:

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

je suis également capable de stocker directement dans GridFS à partir d'un readStream lorsque le readStream est créé à partir d'un fichier sur le serveur. (voir le code)

j'ai les fichiers suivants:saveFromReq.js qui est à l'écoute de la POSTE et fondamentalement juste l'envoie à l' 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;

Toute aide serait grandement appréciée!

18
demandé sur Zeeshan Hassan Memon 2013-12-31 20:08:38

5 réponses

gridfs-stream en fait c'est assez facile:

// `gfs` is a gridfs-stream instance
app.post('/picture', function(req, res) {
  req.pipe(gfs.createWriteStream({
    filename: 'test'
  }));
  res.send("Success!");
});
18
répondu robertklep 2013-12-31 17:41:08

@robertklep réponse est bonne, je voudrais ajouter quelque chose à sa réponse. Ce code montre comment vous pouvez renvoyer les métadonnées du fichier stocké.

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});
  }));
})  
1
répondu vinesh 2016-02-25 09:32:40

cela a fonctionné pour moi avec mongoose:

 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');

j'ai du mal quelques jours à obtenir la vidéo sur le navigateur côté client. C'est ce que j'ai essayé jusqu'à présent:

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;
    });

Mes Données sur MongoDB côté ressemble à:

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

Et le contentType est 'video / mp4':

journalisation sur navigateur côté imprime ceci:

Objet { 0: "�", 1: "�", 2: "�", 3: "", 4: "f", 5: "t", 6: "y", 7: "p", 8: "i", 9: "s", 85003 plus...}

0
répondu udito 2016-06-08 15:29:44

code complet pour insérer le txtfile dans mongodb en utilisant gridfs dans nodejs.Cela fonctionne bien `

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!!!");
});

`

0
répondu vigneshRavi 2017-01-07 15:57:58

Code complet pour afficher l'image de html à nodejs stocker cette image dans mongodb en utilisant le système gridfs et afficher cette image dans le serveur.Ce code fonctionne bien.

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>
0
répondu vigneshRavi 2017-01-07 16:06:48