簡體   English   中英

將POST請求中的數據流存儲在GridFS,Express,mongoDB,node.js中

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

我試圖弄清楚如何將圖像直接發布到GridFS而不先將其作為臨時文件存儲在服務器上的任何位置。

我正在使用郵遞員(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;

任何幫助將不勝感激!

gridfs-stream使這變得非常容易:

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

雖然@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});
  }));
})  

這對我來說是貓鼬的工作:

 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,“數據”:BinData(0,“ AAAAIGZ0eXBpc29。 ..

而且contentType是“ video / mp4”:

在瀏覽器端登錄將顯示以下內容:

對象{0:“ '',1:” “,2:” “,3:”“,4:” f“,5:” t“,6:” y“,7:” p“,8 :“ i”,9:“ s”,85003更多…}

有人可以救我一命嗎? 希望您不要在這個地方看不到我的帖子。

使用nodejs中的gridfs在mongodb中插入txtfile的完整代碼。

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

`

完整的代碼以將圖像從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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM