简体   繁体   中英

How can I upload image to cloudinary using multer in node and express with other data

Please what I am getting wrong in my code? I want to setup my web app so that when users post image through a form with other text data, the image will be uploaded to cloudinary and the url will be returned and along with other data submitted by the user, all the record will be saved to my database. Please note that I am using pg-promise library and postgres DB. I include my codes below for reference.

MY DATA SCHEMA

CREATE TABLE photo_table (
  post_id uuid REFERENCES post(post_id) NOT NULL,
  photo_by text REFERENCES m_user(username),
  title text NOT NULL,
  description text NOT NULL,
  photo_url text NOT NULL,
  category text,
  location text,
  campaign text,
  posted_on timestamp NOT NULL default now(),
  updated_on timestamp NOT NULL default now(),
  PRIMARY KEY (pid)
);

MY CLOUDINARY & MULTER CONFIG FILE

const cloudinary = require('cloudinary').v2;
const multer = require("multer");
const cloudinaryStorage = require("multer-storage-cloudinary");

cloudinary.config({
  cloud_name: 'xxxxxxxx',
  api_key: 'xxxxxxxx3115',
  api_secret: 'xxxxxxxxxxxxYXpmAAr3b04'
}); 

const storage = cloudinaryStorage({
  cloudinary: cloudinary,
  folder: "photos",
  allowedFormats: ['jpg', 'jpeg', 'png'],
  transformation: [{ width: 960, height: 960, crop: "limit" }],
  filename: (req, file, callback) => {
    const name = file.originalname.split(' ').join('_');
    callback(undefined, name);
  }
});

module.exports = multer({storage: storage}).single('photo');

MY API POST REQUEST

const multer = require('../middlewares/multer/photo-config'); 

//multer is called in my route file as shown in the line below

router.post('/', multer, photoCtrl.addPhoto);

The function below is my controller request

function addPhoto(req, res, next) {
  const queryPhoto = 'INSERT INTO post (post_type, created_on) VALUES($1, $2) RETURNING pid'
  db.tx('my-transaction', t => {
    return t.one(queryPhoto, ['photo', 'now()'])
        .then(post => {
          const data = {
        photo_by: req.body.username,
        title: req.body.title,
        description: req.body.description,
        photo_url: req.files,
        category: req.body.category,
        location: req.body.location,
        campaign: req.body.campaign
      }
      const insertPhotoText = `INSERT INTO photo_table (pid, photo_by, title, description, photo_url, category, location, campaign, posted_on, updated_on) 
                                   VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`
      const insertPhotoValues = [post.pid, data.photo_by, data.title, data.description, data.photo_url, data.category, data.location, data.campaign, 'now()', 'now()']
              return t.none(insertPhotoText, insertPhotoValues);
        });
})
    .then(function () {
      res.status(200)
        .json({
          status: 'success',
          message: 'One photo added'
        });
    })
    .catch(function (err) {
      return next(err);
    })
  }
  

In order to upload to Cloudinary, you need to call the uploader() method: https://cloudinary.com/documentation/node_integration

Sample code:

app.post('/', upload.any([{ name: "test" }]), (req, res) => {
        var files=req.files;
        if(files){
            files.forEach(function(file){
                cloudinary.uploader.upload(file.path, function(result) { 
                console.log(result);
            });
            });
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM