2016-12-19 1 views
7

나는 보았다 무엇 :Node.js에서 GCloud로 파일을 업로드하는 방법은 무엇입니까?


의 생각 :

현재 이미지를 로컬에 저장하고 이미지 경로를 Firebase 실시간 데이터베이스에 저장합니다. GCLUD (비용 절감)에 이미지를 저장하고 싶습니다.


질문 :

어떻게 내가 내 현재 코드 GCLOUD에 업로드를 수정해야?


현재 코드 :

var express = require("express"); 
var router = express.Router(); 
var flash = require("connect-flash"); 

var firebase = require("firebase"); 

var multer = require("multer"); 
var upload = multer({dest:"./public/images/uploads/", limits: {fileSize: 250000}}).single("image"); 


router.get("/", function(req, res, next){ 

    if (firebase.auth().currentUser == null) { 
     global.page_name = "login"; 
     res.render("users/login"); 
    } 
    else { 
     global.page_name = "upload"; 
     res.render("upload"); 
    } 
}); 

router.post("/", function(req, res, next){ 
    upload(req,res, function (err) { 
     if (err) { 
      req.flash("error_msg", "File too large. Max Size: 250KB"); 
      res.redirect("/upload"); 
      return 
     } 


     var title = req.body.title; 
     var section = req.body.section; 

     // Validation 
     req.checkBody('title', 'Title is required').notEmpty(); 
     req.checkBody('title', 'Title is too long, max: 50 charachters !').len(0,50); 
     req.checkBody('section', 'Section is required').notEmpty(); 

     var errors = req.validationErrors(); 

     if(errors){ 
      res.render('upload', { 
       errors: errors 
      }); 
     } 
     else { 

      if (req.file){ 

       console.log("Uploading file..."); 
       var image = req.file.filename; 
       var section = req.body.section.toLowerCase(); 

       var IDref = firebase.database().ref("posts/"+section+"/lastID"); 

       IDref.once("value", function(IDsnapshot){ 
        var number = IDsnapshot.val(); 
        var postRef = firebase.database().ref("posts/"+section).push(); 
        var UID = postRef.key; 
        var post = { 
         title: req.body.title, 
         section: req.body.section, 
         image: image, 
         author: firebase.auth().currentUser.uid, 
         section: section, 
         upvotes: 0, 
         downvotes: 0, 
         id: number + 1, 
         key: UID 
        } 

        IDref.set(post.id); 

        postRef.set(post); 

        var authoredPost = { 
         title: req.body.title, 
         section: section, 
        } 

        var userRef = firebase.database().ref("users/"+firebase.auth().currentUser.uid.toString()+"/posts/"+UID.toString()); 
        userRef.set(authoredPost); 

       }); 

       req.flash("success_msg", "Post Created"); 
       res.redirect("/upload"); 
      } 
      else { 
       console.log("No file uploaded"); 
       req.flash("error_msg", "Image is required"); 
       res.redirect("/upload"); 
      } 
     } 
    }); 
}); 

module.exports = router; 
+0

정말 좋은 질문입니다. 지금까지 본 자료를 열거 해 주셔서 감사합니다. 이걸 따라하려고 했니? 있다면, 어떤 문제가 있습니까? https://cloud.google.com/nodejs/getting-started/using-cloud-storage –

답변

4

내가 그것의 더 나은이 GCloud에 직접 업로드 할 웹 또는 앱에서 firebase.storage을 사용할 생각하지만, 당신이 당신의 문제를 해결하기 위해이 코드를 사용할 수 있습니다

var express = require("express"); 
var router = express.Router(); 
var flash = require("connect-flash"); 

var fs = require('fs'); 
var firebase = require("firebase"); 
var gcloud = require('google-cloud'); 

var multer = require("multer"); 
var upload = multer({dest:"./public/images/uploads/", limits: {fileSize: 250000}}).single("image"); 


// Enable Storage 
var gcs = gcloud.storage({ 
    projectId: 'grape-spaceship-123', 
    keyFilename: '/path/to/keyfile.json' 
}); 

// Reference an existing bucket. 
var bucket = gcs.bucket('my-existing-bucket'); 

router.get("/", function(req, res, next){ 
    if (firebase.auth().currentUser == null) { 
     global.page_name = "login"; 
     res.render("users/login"); 
    } 
    else { 
     global.page_name = "upload"; 
     res.render("upload"); 
    } 
}); 

router.post("/", function(req, res, next){ 
    upload(req,res, function (err) { 
     if (err) { 
      req.flash("error_msg", "File too large. Max Size: 250KB"); 
      res.redirect("/upload"); 
      return 
     } 


     var title = req.body.title; 
     var section = req.body.section; 

     // Validation 
     req.checkBody('title', 'Title is required').notEmpty(); 
     req.checkBody('title', 'Title is too long, max: 50 charachters !').len(0,50); 
     req.checkBody('section', 'Section is required').notEmpty(); 

     var errors = req.validationErrors(); 

     if(errors){ 
      res.render('upload', { 
       errors: errors 
      }); 
     } 
     else { 

      if (req.file){ 


       console.log("image saved successfully in local"); 

       //upload to the GCloud 
       bucket.upload(req.file.filename, function(err, file) { 
        if (!err) { 
         console.log("image saved successfully in GCloud"); 


         //remove local image 
         fs.unlink(req.file.filename, (err) => { 
          if (err) throw err; 
           console.log('successfully deleted /tmp/hello'); 
         }); 


         //store image name in firebase 
         var image = file.name;//may be another key hold the image name. 
         var section = req.body.section.toLowerCase(); 

         var IDref = firebase.database().ref("posts/"+section+"/lastID"); 

         IDref.once("value", function(IDsnapshot){ 
          var number = IDsnapshot.val(); 
          var postRef = firebase.database().ref("posts/"+section).push(); 
          var UID = postRef.key; 
          var post = { 
           title: req.body.title, 
           section: req.body.section, 
           image: image, 
           author: firebase.auth().currentUser.uid, 
           section: section, 
           upvotes: 0, 
           downvotes: 0, 
           id: number + 1, 
           key: UID 
          } 

          IDref.set(post.id); 

          postRef.set(post); 

          var authoredPost = { 
           title: req.body.title, 
           section: section, 
          } 

          var userRef = firebase.database().ref("users/"+firebase.auth().currentUser.uid.toString()+"/posts/"+UID.toString()); 
          userRef.set(authoredPost); 

         }); 

         req.flash("success_msg", "Post Created"); 
         res.redirect("/upload"); 

        } 
       }); 




      } 
      else { 
       console.log("No file uploaded"); 
       req.flash("error_msg", "Image is required"); 
       res.redirect("/upload"); 
      } 
     } 
    }); 
}); 

module.exports = router; 
+0

SDK가 Node.js에서 작동하지 않고 Firebase에 노드에 추가 할 계획이 없으므로 firebase.storage를 사용할 수 없습니다. .js :(다음 24 시간 내에 코드를 사용해 보겠습니다. – Coder1000

+0

참조 : http://stackoverflow.com/questions/39848132/upload-files-to-firebase-storage-using-node-js – Coder1000

+0

사용합니까 이 코드와 다른 노드 js 프로그램이나 웹 응용 프로그램이나 안드로이드 응용 프로그램 또는 ios 응용 프로그램과 같은 클라이언트에 의한 라우팅? – fingerpich

관련 문제