Как загрузить два изображения (не массив) с разными именами в Cloudinary?

#node.js #mongoose #cloudinary

#node.js #мангуст #cloudinary

Вопрос:

Я работаю над проектом с использованием NodeJS и Mongoose. У меня есть схема клиента с двумя разными атрибутами изображения (1) customer_profile_image (2) customer_logo вместе с данными других клиентов. Я хочу загрузить оба изображения с помощью POST API при добавлении нового клиента (не массива изображений), и я хочу, чтобы одна ссылка для каждого изображения сохранялась в базе данных после его загрузки в Cloudinary. Я использовал Cloudinary раньше для загрузки одного изображения или массива изображений, потому что легко загружать изображения с одинаковыми именами, но в этом случае я не знаю, как загрузить два изображения с разными именами. Что мне делать? Принимает ли функция загрузки Cloudinary более одного параметра? и если это произойдет, как определить, какое изображение в данный момент загружается на сервер и какая ссылка для какого изображения? Ниже приведена функция, которую я использую для загрузки одного изображения в Cloudinary:

     app.post('/customer', upload.single('customer_profile_image'), async (request, response, next) => {
const path = request.file.path;
var uniqueFilename = new Date().toISOString();
var img = await cloudinary.uploader.upload(
            path, {
            public_id: `blog/${uniqueFilename}`,
            tags: `blog`
        }, // directory and tags are optional
            async function (err, image) {
                if (err) return (err)
                fs.unlinkSync(path);
                // console.log(image);
                var customer = new Customer(request.body);
                customer.customer_profile_image= await image.secure_url
})
})
  

Ответ №1:

Вам нужно будет загружать каждое изображение по отдельности в его собственном вызове загрузки и указывать общедоступный идентификатор для этого изображения. Cloudinary не поддерживает загрузку нескольких изображений за один вызов загрузки. Кроме того, если вы измените вызов загрузки, чтобы использовать параметр папки вместо общедоступного идентификатора, он добавит случайную строку в конец. Например, загрузка Cloudinary all может выглядеть так:

 var customer = new Customer(request.body);
const path = request.file.path;
var customer_profile_image = await cloudinary.uploader.upload(
            path, {
            folder: `blog/customer_profile_image`,
            // public id = blog/customer_profile_image/<randomly-generated-string>
            // e.g. blog/customer_profile_image/djqhfhwidhalwdi
            tags: `blog`
        }, // directory and tags are optional
            async function (err, image) {
                if (err) return (err)
                customer.customer_profile_image = image.secure_url
})
  

Аналогично, вам нужно будет выполнить отдельный вызов загрузки для customer_logo

 var customer_logo = await cloudinary.uploader.upload(
            path, {
            folder: `blog/customer_logo`,
            // public id = blog/customer_logo/<randomly-generated-string>
            // e.g. blog/customer_logo/sdjoqnfhjahslq
            tags: `blog`
        }, // directory and tags are optional
            async function (err, image) {
                if (err) return (err)
                customer.customer_logo = image.secure_url
})
  

Комментарии:

1. под вызовом загрузки saparate вы имели в виду saparate post api? вы пытаетесь сказать, что я должен создать два API, один из которых принимает customer_profile в качестве параметров в функции upload.single, а другой — с логотипом клиента в качестве параметров. Например, upload.single(‘customer_profile’) amp; upload.single(‘customerLogo’)??

2. как я могу добиться такой многократной загрузки изображений за один вызов post??

3. Два примера, которые я включил, должны быть внутри вашего app.post, если вы передаете два изображения внутри этого post-вызова.