How to upload images to GCS bucket with multer and NodeJS?

不打扰是莪最后的温柔 提交于 2021-02-08 01:57:40

问题


I'm facing issues for uploading local images to my google cloud storage.

I've already tried two methods. The first one is uploading with multer

var storage = multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, './uploads/')
    },
    filename: (req, file, cb) => {
      cb(null, file.fieldname + '-' + Date.now())
    }
});
var upload = multer({storage: storage}).single('image'); 

app.post('/upload',function(req,res,next){
  upload(req,res,(err) => {
    if(err){
      console.log(err)
    }else{
      console.log(req.file)
    }
  })

})

Then, i've tried directly with GCS

var bucket = admin.storage().bucket('mybucket')
app.post('/upload',function(req,res,next){
 bucket
.save(file)
.then(() => {



})

for both of these solutions , req.files is always undefined whereas req.body is a buffer like this :

<Buffer 2d 2d 2d 2d ...>

when i try to save this buffer on my GCS bucket, i the .jpg/png file is created in my bucket but it is corrupted.

I'm browsing the web seeking for a solution but i found nothing that helped me to overcome this situation.

Any advice ?


回答1:


You need multer, multer-google-storage and ofcourse bodyParser if you have additional form values. You need to sent data in multipart/form-data

In your .env file

GCS_BUCKET = <bucket name>
GCLOUD_PROJECT = <project id>
GCS_KEYFILE = <key file location>

You can download key file from GCP Console>Your Project>I AM & Admin>Service Accounts

In your route

const multer = require('multer');
const multerGoogleStorage = require("multer-google-storage");

var uploadHandler = multer({
  storage: multerGoogleStorage.storageEngine()
});

router.post('/', uploadHandler.single('image'), function (req, res, next) {
  const body = req.body;
  res.json({fileName: req.file.filename});
  res.end();

}

This will store file on to GCS with name [random-string-generated-by-gcs]_[YOUR FILE NAME WITH EXTENTION]. The same can be access under the route via req.file.filename.

Documentation




回答2:


Make sure you have added enctype="multipart/form-data" attribute to your form. A probable reason for req.files being undefined.



来源:https://stackoverflow.com/questions/53529947/how-to-upload-images-to-gcs-bucket-with-multer-and-nodejs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!