2017-02-12 78 views
1

我有一个使用node.js的后端和一个使用jquery,javascript,ajax和bootstrap的前端。我想从前端上载图像并将其保存到猫鼬数据库中。此处文件加载成功,图像将位于/public/img的位置。但是,如何使用API​​调用将这些图像信息保存到数据库中。
下面是我的代码:如何使用Node.js服务器将我的图像数据从前端保存到Mongoose数据库中

后端代码的Node.js,猫鼬

/server.js

var express = require("express"); 
var multer = require('multer'); 
var path = require('path'); 
var mongoose = require('mongoose'); 
var bodyParser = require('body-parser'); 

var app = express(); 
    app.appname="photogallery"; 

//config mongoose 
    app.db = mongoose.createConnection('localhost/'+app.appname); 
    app.db.on('error', console.error.bind(console, 'mongoose connection error: ')); 
    app.db.once('open', function() { 
    //Storage is all good 
    }); 

//Routes and acl 
    var router = express.Router(); 
    require('./routes')(app, router, passport); 

var file_url = ''; 

var storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
    callback(null, 'public/img/'); 
    }, 
    filename: function (req, file, callback) { 
    callback(null, file.fieldname + '-' + Date.now()); 
    file_url = file.fieldname + '-' + Date.now() + '.' + file.originalname.split('.')[file.originalname.split('.').length -1] 
    callback(null, file_url); 
    } 
}); 

var upload = multer({ storage : storage}).single('userPhoto'); 

app.use(express.static(path.join(__dirname, '/public/'))); 

app.post('/api/photo',function(req,res){ 
    upload(req,res,function(err) { 
     if(err) { 
      return res.end("Error uploading file."); 
     } 
     // res.end("File is uploaded"); 
     res.json({error_code:0,err_desc:null,file_url:'img/'+file_url}); 
     /*Now I want to save this file_url to image_url using api /api/photoGallery, please help me to save these information to the db */ 
    }); 
}); 

//config express 
    app.set('secret','thisshouldnotbeinplaintext'); 
    app.use(bodyParser.urlencoded({ extended: false })); 
    app.use(bodyParser.json()); 
    app.use(passport.initialize()); 
    app.use(router); 


app.listen(5050,function(){ 
    console.log("Working on port 5050"); 
}); 

/api/requests.js

'use strict'; 
    var passport = require('passport'); 
    var app = require('../app'); 

exports.init = function(pp) { 
    passport = pp; 
    app = pp; 
    return exports; 
}; 

exports.root = function(req, res) { 
    res.send("Running"); 
    }; 

//Add Image Data 
exports.addData = function(req, res) { 
    var addData = req.app.db.model('Data'); 
    var data = { image_title : req.body.image_title, 
       image_url : "http://localhost:5050/"+req.body.image_url 
       } 
    var query = addData(data); 
    query.save(function(err){ 
    if(err){ 
     console.log(err.toString()); 
    } 
    console.log('Image Saved Successfully'); 
    res.json({ success: true }); 
}); 
}; 

个/schema/Data.js

'use strict'; 

exports = module.exports = function(app, mongoose) { 
    var dataSchema = new mongoose.Schema({ 
     image_title : { type: String, unique: true, lowercase: true }, 
     image_url : { type: String, unique: true, lowercase: true } 
    }); 
    app.db.model('Data', dataSchema); 
}; 

/models.js

'use strict'; 

module.exports = function(app, mongoose) { 
    //Mongoose Schemas 
    require('./schema/Data')(app, mongoose); 
}; 

/routes.js

'use strict'; 

module.exports = function(app, router, passport) { 

    var requests = require('./api/requests').init(passport); 
    router.get('/', requests.root); 

    router.post('/api/addPhoto/v1', requests.addData); 
    router.get('/api/getPhoto/v1', requests.getPhoto); 

}; 

如Json的会像下面

{ 
    image_title: exampleImage, 
    image_url: xyzscjnscncsl.exampleImage.png 
} 

前端代码jQuery的,JavaScript中,阿贾克斯,HTML

/public/index.html

<div class="modal fade" id="myModal" role="dialog"> 
    <div class="modal-dialog"> 
     <!-- Modal content--> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal">&times;</button> 
       <h4 class="modal-title">Please Upload Image</h4> 
      </div> 
      <form id="uploadForm" enctype="multipart/form-data" action="/api/photo" method="post"> 
      <div class="modal-body"> 
       <div class="form-group"> 
        <input type="text" class="form-control" id="imagetitle" placeholder="Image Title"> 
       </div> 
       <div class="form-group"> 
        <input type="file" class="form-control" id="input-image" name="userPhoto" accept="image/*"> 
       </div> 
      </div> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-default" data-dismiss="modal">Cancle</button> 
       <button type="submit" class="btn btn-default" value="Upload Image" name="submit">Save</button> 
      </div> 
       <span id = "status"></span> 
      </form> 
     </div> 
    </div> 
</div> 

/public/javascript/image.js

如何使用API​​调用将图像数据从此处保存到mongoose数据库中?

$(document).ready(function() { 
    $('#uploadForm').submit(function() { 
     $("#status").empty().text("File is uploading..."); 
     $(this).ajaxSubmit({ 
      error: function(xhr) { 
       status('Error: ' + xhr.status); 
      }, 
      success: function(response) { 
       console.log(response) 
       $("#status").empty().text(response); 
      } 
     }); 
     return false; 
    });  
}); 
+0

我只想说“不”。将图像数据保存到数据库中并不是一种好方法。数据库能够但不优化,阻止大型二进制块的存储。你最好将它保存到一些块存储服务(例如S3)中,然后在你的数据库中添加一个URL。 – Paul

+0

好的谢谢,但不是我的问题的解决方案。在这里我不想保存在S3中。我想将它保存在我的数据库中。请帮助我的任何人,我是这些技术中的新人。 – ronny

回答

0

我建议你使用busboy而不是multer,因为multer保存到磁盘,并且busboy返回一个流,你可以管到任何你想要的(甚至是mongoDB)。

Gridfs-stream是一个很好的模块,可以使用gridfs功能将数据流式传输到您的mongoDB。

这里是在一起的基本使用它们:

var Busboy = require('busboy'); 
var gfs = require('gridfs-stream')(mongoose.connection.db, mongoose.mongo) 


//express middleware: 
function (req, res) { 
    var busboy = new Busboy({ headers: req.headers, limits: { fileSize: 1024, files: 1 } }); 
    busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { 
     var ws = gfs.createWriteStream({ filename: filename, content_type: mimetype}); 
     ws.on('error', function(err) { 
      console.error(err); 
      res.send(500, err); 
     }); 
     ws.on('finish',() => {/*do something when streaming ends*/}); 
     file.pipe(ws); 
    } 
    busboy.on('error', function(err) { 
     console.error(err); 
     res.send(500, err); 
    }); 
    req.pipe(busboy); 
} 
+0

这是一个关于网格的链接:https://docs.mongodb.com/manual/core/gridfs/ –

+0

谢谢,但我想通过**/api/photoGallery **,json将图像信息存储在我的数据库中({image_title:myImage,image_url:xxxxxmyImage.png})。请参阅我的架构,模型,mongo连接,路由。请帮助我将这些图像信息保存到数据库中。 – ronny

+0

您可以将元数据添加到createWriteStream函数中的文件中,或者在流结束事件中跟进对mongoose API的调用。 –

1

我不会建议大多数项目(如保罗评论),但它并不复杂。

从客户端获取图像文件后,读取图像数据(fs.readFile)并使用缓冲区将其编码为base64并保存到数据库中,这样您将使用较少的空间来存储数据。然后在需要二进制文件时解码base64数据。

fs.readFile('foo.png', function(err, data) { 
    const base64img = new Buffer(data).toString('base64'); 
}); 

有一些NPM模块,使这个简单一点,如基于64位IMG

+0

谢谢,我会试试看。 – ronny

0

/*下面是解*/

/server.js

var express = require("express"); 
var multer = require('multer'); 
var path = require('path'); 
var passport = require('passport'); 
var mongoose = require('mongoose'); 
var bodyParser = require('body-parser'); 



var app = express(); 
app.appname="photogallery"; 

//config mongoose 
app.db = mongoose.createConnection('localhost/'+app.appname); 
app.db.on('error', console.error.bind(console, 'mongoose connection error: ')); 
app.db.once('open', function() { 
}); 


//config data models 
require('./models')(app, mongoose); 

//Routes and acl 
var router = express.Router(); 
require('./routes')(app, router, passport); 

/* Image Logic */ 
var file_url = ''; 
var storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
    callback(null, 'public/img/'); 
    }, 
    filename: function (req, file, callback) { 
    callback(null, file.fieldname + '-' + Date.now()); 

     file_url = file.fieldname + '-' + Date.now() + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]; 
     callback(null, file_url); 
    } 
}); 

var upload = multer({ storage : storage}).single('userPhoto'); 

app.use(express.static(path.join(__dirname, '/public/'))); 

app.post('/api/photo',function(req,res){ 
    upload(req,res,function(err) { 
     if(err) { 
      return res.end("Error uploading file."); 
     } 
     //res.end("File is uploaded"); 
     //console.log("file_url", file_url); 
     res.json({error_code:0,err_desc:null, file_url:'img/'+file_url}); 
    }); 
}); 

//config express 
app.set('secret','thisshouldnotbeinplaintext'); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(bodyParser.json()); 
app.use(passport.initialize()); 
app.use(router); 

app.listen(5050,function(){ 
    console.log("Working on port 5050"); 
}); 

/api/requests.js

'use strict'; 

    var jwt = require('jsonwebtoken'); 
    var passport = require('passport'); 

    exports.init = function(pp) { 
     passport = pp; 
     return exports; 
    }; 

    exports.root = function(req, res) { 
     res.send("Running"); 
    }; 

/* Save Image Data Function */ 

    exports.addData = function(req, res) { 
     var addData = req.app.db.model('Data'); 
     var data = { 
      img_title : req.body.img_title, 
      img_url  : "http://localhost:5050/"+req.body.img_url 
     } 
     var query = addData(data); 
     query.save(function (err, data) { 
      if (err) { 
       console.log(err.toString()); 
      } else { 
       console.log('Image saved Successfully'); 
       res.json(data); 
      } 
     }); 
    }; 

/* Get Image Data Function */ 
    exports.getPhoto = function(req, res) { 
      var getPhoto = req.app.db.model("Data"); 
      var query = getPhoto.find(function(err, data){ 
       if(err) { 
        console.log("Not Found"); 
       } else { 
        res.json({'data': data}); 
       } 
      }); 
     }; 

/schema/Data.js

'use strict'; 

module.exports = function(app, mongoose) { 
    var dataSchema = new mongoose.Schema({ 
     img_title  : { type: String, default: '' }, 
     img_url   : { type: String, default: '' } 

    }); 
    app.db.model('Data', dataSchema); 
}; 

/models.js

'use strict'; 

module.exports = function(app, mongoose) { 
    //Mongoose Schemas 
    require('./schema/Data')(app, mongoose); 
} 

/routes.js

'use strict'; 

module.exports = function(app, router, passport) { 

    var requests = require('./api/requests').init(passport); 
    router.get('/', requests.root); 

    router.post('/api/addPhoto/v1', requests.addData); 
    router.get('/api/getPhoto/v1', requests.getPhoto); 

}; 

/public/index.html

<div class="modal fade" id="myModal" role="dialog"> 
    <div class="modal-dialog"> 
     <!-- Modal content--> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal">&times;</button> 
       <h4 class="modal-title">Please Upload Image</h4> 
      </div> 
      <form id="uploadForm" enctype="multipart/form-data" action="/api/photo" method="post"> 
      <div class="modal-body"> 
       <div class="form-group"> 
        <input type="text" class="form-control" id="imagetitle" placeholder="Image Title"> 
       </div> 
       <div class="form-group"> 
        <input type="file" class="form-control" id="input-image" name="userPhoto" accept="image/*"> 
       </div> 
      </div> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-default" data-dismiss="modal">Cancle</button> 
       <button type="submit" class="btn btn-default" value="Upload Image" name="submit">Save</button> 
      </div> 
       <span id = "status"></span> 
      </form> 
     </div> 
    </div> 
</div> 

/public/javascript/image.js

/*如何从前端保存图像数据利用到猫鼬API调用*/

$(document).ready(function() { 
    $('#uploadForm').submit(function() { 
     $("#status").empty().text("File is uploading..."); 
     var imageTitle = $("#imagetitle").val(); 
     $(this).ajaxSubmit({ 

      error: function(xhr) { 
        status('Error: ' + xhr.status); 
      }, 

      success: function(response) { 
       var localFile = response.file_url; 
       $.ajax({ 
        url: "/api/addPhoto/v1", 
        data: { 
         img_title: imageTitle, 
         img_url: localFile 
        }, 
        method: 'post', 
        dataType: 'json', 
        success: function(data) { 
         var html = ""; 
          html+= "<div class='col-md-3 col-md-offset-1'>"; 
          html+= "<div class='img-box imgClass'>"; 
          html+= "<img src='"+data.img_url+"'>"; 
          html+= "</div> </div>"; 
         $('.myimage').append(html); 
         $('#myModal').modal('hide'); 

        }, 
        error: function(xhr, status) { 
         alert("Sorry, there was a problem!"); 
        } 
       }); 
      } 
     }); 
     return false; 
    }); 

}); 

$(function(){ 
    $.get("/api/getPhoto/v1", function(response) { 
     //console.log(response.data.length); 
     var html = ""; 
     for(var i = 0; i< response.data.length ; i++){ 
       html+= "<div class='col-md-3 col-md-offset-1'>"; 
       html+= "<div class='img-box imgClass'>"; 
       html+= "<img src='"+response.data[i].img_url+"'>"; 
       html+= "</div> </div>" 
     } 
     $('.myimage').html(html); 
    }); 

}); 
相关问题