如何在节点中使用 multer 将图像上传到 cloudinary 并与其他数据一起表达

Posted

技术标签:

【中文标题】如何在节点中使用 multer 将图像上传到 cloudinary 并与其他数据一起表达【英文标题】:How can I upload image to cloudinary using multer in node and express with other data 【发布时间】:2020-04-10 02:16:11 【问题描述】:

请问我的代码有什么问题?我想设置我的网络应用程序,以便当用户通过带有其他文本数据的表单发布图像时,图像将上传到 cloudinary 并返回 url 并与用户提交的其他数据一起保存所有记录到我的数据库。请注意,我正在使用 pg-promise 库和 postgres DB。我在下面包含我的代码以供参考。

我的数据架构

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)
);

我的 CLOUDINARY 和 MULTER 配置文件

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');

我的 API 发布请求

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

//multer在我的路由文件中被调用如下行所示

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

下面的函数是我的控制器请求

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);
    )
  
  

【问题讨论】:

谢谢@aditi。让我试试这个。但我的主要挑战即将到来,因为我正在尝试使用 pg-promise 在事务中发送发布请求。 【参考方案1】:

要上传到Cloudinary,需要调用uploader()方法:https://cloudinary.com/documentation/node_integration

示例代码:

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);
            );
            );
        

【讨论】:

以上是关于如何在节点中使用 multer 将图像上传到 cloudinary 并与其他数据一起表达的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 multer 模块将图像上传到 mongodb

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何使用 multer 和 NodeJS 将图像上传到 GCS 存储桶?

使用 Multer 将带有 fetch 的图像上传到 Express

MongoDB & Multer - 如何将缓冲区二进制文件转换为图像?