2017-02-12 80 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); 
    }); 

}); 
相關問題