Storing data stream from POST request in GridFS, express, mongoDB, node.js

后端 未结 5 1709
予麋鹿
予麋鹿 2020-12-01 05:53

I am trying to figure out how I can post an image directly to GridFS without storing it anywhere on the server as a temporary file first.

I am using Postman (chrome

相关标签:
5条回答
  • 2020-12-01 06:14

    complete code to post the image from html to nodejs store that image in mongodb using gridfs system and display that image in server.This code works well.

    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 讨论(0)
  • 2020-12-01 06:17

    while @robertklep's answer is correct, I would like to add something to his answer. This code shows how you can send back the stored file's metadata.

    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});
      }));
    })  
    
    0 讨论(0)
  • 2020-12-01 06:20

    gridfs-stream makes that pretty easy:

    // `gfs` is a gridfs-stream instance
    app.post('/picture', function(req, res) {
      req.pipe(gfs.createWriteStream({
        filename: 'test'
      }));
      res.send("Success!");
    });
    
    0 讨论(0)
  • 2020-12-01 06:29

    Complete code to insert the txtfile in mongodb using gridfs in nodejs.This works well `

    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 讨论(0)
  • 2020-12-01 06:32

    This worked for me with 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');
    

    I am struggling a couple of days with getting the video on client side browser. That is what I tried so far:

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

    My Data on MongoDB side looks like:

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

    And the contentType is 'video/mp4':

    logging on browser side prints this:

    Object { 0: "�", 1: "�", 2: "�", 3: " ", 4: "f", 5: "t", 6: "y", 7: "p", 8: "i", 9: "s", 85003 more… }

    Could someone please save my live? I hope you do not see my post as not convenient in this place.

    0 讨论(0)
提交回复
热议问题