Храните в двух разных папках с помощью multer-storage-cloudinary

#mongodb #express #cloudinary

Вопрос:

Я хотел бы хранить аватары пользователей в папке, отличной от папки продукта в Cloudinary.

Я пытался это сделать, но это не работает. Как я могу использовать две разные папки в одном проекте?

Конфигурация Cloudinary:

 const cloudinary = require('cloudinary').v2;

const { CloudinaryStorage } = require('multer-storage-cloudinary');
const multer = require('multer')

 cloudinary.config ({
    cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
    api_key: process.env.CLOUDINARY_KEY,
    api_secret: process.env.CLOUDINARY_SECRET
})


// PARA ALMACENAR LAS IMAGENES DE LOS PRODUCTOS
 const storage = new CloudinaryStorage ({
    cloudinary: cloudinary,
    params:{
        folder: 'ProductosMarketV2',
        allowedFormats : ['jpeg', 'png', 'jpg'],
        // transformation: [{ width: 640, height: 480, crop:'fit'}],
    }
    
});

const parser = multer({storage})


//PARA ALMACENAR LAS IMAGENES DE LOS AVATARES DE USUARIOS
const storage2 = new CloudinaryStorage ({
    cloudinary: cloudinary,
    params:{
        folder: 'ProductosMarketV2/AvataresUsuarios',
        allowedFormats : ['jpeg', 'png', 'jpg'],
        // transformation: [{ width: 640, height: 480, crop:'fit'}],
    }
    
});

const parser2 = multer({storage2})

module.exports = {
    cloudinary,
    storage,
    parser,
    parser2
}
 

parser работает, если я использую аватар или продукт и сохраняю изображения в правильной модели в MongoDB. Но если я использую a parser2 , это не сработает.

В моих маршрутах parser работает и сохраняет URL-адрес и имя файла в модели аватара mongodb:

 router.post('/avatar/:id',
auth,
parser.single('imagesAvatar'),
users.crearAvatar
);
 

с parser2 не работает:

 router.post('/avatar/:id',
auth,
parser2.single('imagesAvatar'),
users.crearAvatar
);
 

Спасибо за вашу помощь.

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

1. Когда вы упоминаете, что это не работает, не могли бы вы поделиться дополнительной информацией об этом? Вы получаете какие-либо ошибки при использовании parser2, действительно ли вызывается эта часть кода? Загружается ли изображение всегда в папку «ProductosMarketV2» даже с обоими анализаторами?

2. Это не работает. У меня есть две конфигурации, и когда я пытаюсь использовать de parser2, не отправляйте изображение в cloudinary, сохраняйте и возвращайте данные (URL и имя файла), но если я использую синтаксический анализатор, он работает отлично. Я хотел бы отдельно хранить аватар пользователей и изображения продуктов……что-нибудь помогает? Спасибо

Ответ №1:

Я действительно нашел решение:

Вы можете настроить свои облачные данные:

 const cloudinary = require('cloudinary').v2;

const { CloudinaryStorage } = require('multer-storage-cloudinary');
const multer = require('multer')


 cloudinary.config ({
    cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
    api_key: process.env.CLOUDINARY_KEY,
    api_secret: process.env.CLOUDINARY_SECRET
})


// PARA ALMACENAR LAS IMAGENES DE LOS PRODUCTOS
 const storage = new CloudinaryStorage ({
    cloudinary: cloudinary,
    params:{
        folder: 'ProductosMarketV2',
        allowedFormats : ['jpeg', 'png', 'jpg'],
        // transformation: [{ width: 640, height: 480, crop:'fit'}],
    }
    
});


//PARA ALMACENAR LAS IMAGENES DE LOS AVATARES DE USUARIOS
const storage2 = new CloudinaryStorage ({
    cloudinary: cloudinary,
    params:{
        folder: 'ProductosMarketV2/AvataresUsuarios',
        allowedFormats : ['jpeg', 'png', 'jpg'],
        // transformation: [{ width: 640, height: 480, crop:'fit'}],
    }
    
});

const parser = multer({storage: storage})

//const parser2 = multer({storage2})

module.exports = {
    cloudinary,
    storage,
    storage2,
    parser
}
 

а затем в маршрутах вместо этого используйте:

 const { parser,  storage2} = require ('../cloudinary')
const multer = require('multer')

router.put("/editar/:id", 
    auth, 
    parser.single("imagesAvatar"),//with the folder name in the configuration of cloudinary
    users.editarUsuario
    );

//use multer({storage: 'the folder name')} and allways works
    
router.put("/editar/:id", 
    auth, 
    multer({storage: storage2}).single("imagesAvatar"),
    users.editarUsuario
    );