#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-вызова.