Como armazenar imagem no backend do nó?
Estou usando node and express para back-end e Mongo DB para storage. Estou usando middleware de multer para armazenar imagens, tenho um problema e o problema é que quando eu armazeno uma imagem do host local, ela é salva em meu back-end e também exibida no banco de dados , mas quando implanto a mesma API no heroku ou em qualquer outro aplicativo, a imagem é mostrada no banco de dados, mas não é armazenada no meu back-end. Testei o código no carteiro, qual pode ser o problema?
A seguir está meu código no node js:
router.use(express.static(__dirname + 'public'));
let storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'public')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
}
})
let upload = multer({ storage: storage })
router.post('/fellows-details', upload.single('image'), async (req, res) => {
const { error } = FellowsDetails(req.body);
if (error) return res.status(400).send({ message: error.details[0].message });
const fellow = new fellowdetails({
name: req.body.name,
details: req.body.details,
image: req.file.filename
})
try {
fellow.save()
res.status(200).send({ message: 'fellows detail saved successfully' })
} catch (err) {
res.status(400).send(err);
}
})
Respostas
Ficará fácil armazenar arquivos após a conversão em string você só precisa converter string em imagem em seu frontend
converta a imagem em base64string usando este código em sua API e também não se esqueça de deletar o arquivo da pasta de upload
"img": new Buffer.from(fs.readFileSync(req.file.path)).toString("base64")
para deletar o arquivo
let resultHandler = function (err) {
if (err) {
console.log("unlink failed", err);
} else {
console.log("file deleted");
}
}
fs.unlink(req.file.path, resultHandler);
na importação de suas rotas multer
`multer const multer = require('multer');
const upload = multer({ dest: __dirname + '/uploads/images' });`
Adicione upload.single('img')em seu pedido
router.post('/fellows-details', authorize([Role.ADMIN, Role.USER]),
upload.single('img'), usersController.fellowsdetails);
O sistema de arquivos no Heroku não é adequado para o armazenamento persistente de dados. O sistema de arquivos Heroku é efêmero - isso significa que qualquer mudança no sistema de arquivos enquanto o dinamômetro está em execução dura apenas até que o dinamômetro seja desligado ou reiniciado. Cada dinamômetro inicializa com uma cópia limpa do sistema de arquivos da implantação mais recente. Você não pode armazenar arquivos no Heroku. Heroku removeu automaticamente seus arquivos carregados. Você deve usar serviços externos como Amazon S3 ou Azure Blob Storage.
https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-node-examples.html https://docs.microsoft.com/en-us/javascript/api/@azure/storage-blob/blockblobclient?view=azure-node-latest
Se você não deseja configurar uma conta com AWS para criar um intervalo S3, também temos add-ons aqui que lidam com o armazenamento e processamento de ativos estáticos https://elements.heroku.com/addons