Express、Multer 和 Cloudinary 未返回完整的 Cloudinary 响应

Posted

技术标签:

【中文标题】Express、Multer 和 Cloudinary 未返回完整的 Cloudinary 响应【英文标题】:Express, Multer, and Cloudinary not returning full cloudinary response 【发布时间】:2021-04-26 10:35:07 【问题描述】:

我正在使用 Multer/multer-storage-cloudinary 将图像直接上传到 Cloudinary,而不是先将其上传到本地临时目录,然后将其发送到 Cloudinary:

const express = require('express');
const router = express.Router(mergeParams:true);
if (app.get('env') == 'development') require('dotenv').config(); 
const crypto = require('crypto');
const cloudinary = require('cloudinary').v2;
const  CloudinaryStorage  = require('multer-storage-cloudinary');
const multer = require('multer');
const  storage  = require('../cloudinary');
const upload = multer(storage);

//configure cloudinary upload settings
cloudinary.config(
    cloud_name:process.env.CLOUDINARY_NAME,
    api_key: process.env.CLOUDINARY_API_KEY,
    api_secret: process.env.CLOUDINARY_API_SECRET
);

const storage = new CloudinaryStorage(
    cloudinary: cloudinary,
    folder: ('book_tracker/'+process.env.CLOUDINARY_FOLDER+'posts'),
    allowedFormats: ['jpeg', 'jpg', 'png'],
    filename: function (req, file, cb) 
        let buf = crypto.randomBytes(16);
        buf = buf.toString('hex');
        let uniqFileName = file.originalname.replace(/\.jpeg|\.jpg|\.png/ig, '');
        uniqFileName += buf;
        
        console.log(req.body);
      cb(undefined, uniqFileName );
    
  );

const middleware = 
    function asyncErrorHandler: (fn) =>
        (req, res, next) => 
            Promise.resolve(fn(req, res, next))
                         .catch(next);
        



/* POST create user page  */
router.post('/register', upload.single('image'), asyncErrorHandler(postRegister));

我遇到的是我在req.file 中得到的响应不是完整的 Cloudinary 响应,其中包括 public_id 等。相反,它是这样的:


  fieldname: 'image',
  originalname: 'My Headshot.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  path: 'https://res.cloudinary.com/<cloudinary_name>/image/upload/v1611267647/<public_id>.jpg',
  size: 379632,
  filename: '<public_id>'

自从我使用 multer-storage-cloudinary 以来已经有一段时间了,尽管 storage 是直接取自一个可以返回正确信息的旧项目。我需要设置 multer 或 multer-storage-cloudinary 中的内容以便将完整的 cloudinary 响应放入 req.file 中吗?

【问题讨论】:

我对 cloudinary 一无所知,但它是否可能是 asyncErrorHandler 没有考虑的流式响应? @Chris 我几乎同意你的看法,除了这不是云响应的截断版本,它正在获取响应并将少数值分配给新键。请参阅此处的“示例响应”:cloudinary.com/documentation/image_upload_api_referencepath 这是 cloudinary 响应中的 secure_url,与 filename 相同的是来自 cloudinary 的 public_id 【参考方案1】:

multer-storage-cloudinary 包是一个第三方包,它以一种简化的方式集成了 multer 和 Cloudinary,但它没有公开来自 Cloudinary SDK 或 API 的所有可能选项或响应

在您的示例中,它不是从 Cloudinary 返回完整的 API 响应,而是字段的子集,因为 file 对象的 filenamepathsize 属性取自 Cloudinary API 响应(分别来自 API 响应的 public_idsecure_urlbytes 属性),但未映射其他字段:https://github.com/affanshahid/multer-storage-cloudinary#file-properties

如果您需要完整的响应值集(或一些尚未映射的特定值),您可以:

请包维护者添加对其他字段的支持 自己分叉包并映射其他字段;尽管我不确定还有什么需要更改的,但这些字段已映射到此处:https://github.com/affanshahid/multer-storage-cloudinary/blob/1eb903d44ac6dd42eb1ab655b1e108acd97ed4ca/src/index.ts#L83-L86 从使用该包包装 Cloudinary SDK 转为直接在您自己的代码中使用 Cloudinary SDK,这样您就可以直接处理响应。 保持原样并单独调用 Cloudinary Admin API 以获取图像的其他详细信息:https://cloudinary.com/documentation/admin_api#get_resources 保持原样,但添加一个 notification_url,以便与 API 调用响应一样,新上传的详细信息将在 HTTP POST 请求中发送到您选择的 URL:https://cloudinary.com/documentation/notifications notification_url 可以在上传 API 调用、上传预设或 Cloudinary 帐户设置中的帐户级别指定。

【讨论】:

谢谢!我想我会选择第三种选择。

以上是关于Express、Multer 和 Cloudinary 未返回完整的 Cloudinary 响应的主要内容,如果未能解决你的问题,请参考以下文章

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

在 Express 路由器中使用 multer 进行文件上传

在控制器内使用Express和Multer解析请求

使用 Multer 重命名上传的文件不起作用 (Express.js)

使用 Multer 和 Express 将多个图像上传到 Cloudinary

如何使用 javascript fetch api 和 express multer 上传图像