Olá, achei interessante o desafio e com algumas pesquisas fiz um breve projetinho com sua ideia.
// projeto proposto
mkdir save-image cd save-image npm init
// Prisma CLI
npm install -g prisma
// crie um arquivo 'schema.prisma' para as definições
datasource db {
provider = "sqlite"
url = "file:dev.db"
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
password String
image Bytes?
}
// para gerar o modelo do Prima baseado no arquivo 'schema.prisma'
npx prisma generate
// dependencias necessárias
npm install express cors @prisma/client sqlite3 npm install multer
// 'index.js' com instruções
const express = require('express');
const cors = require('cors');
const multer = require('multer');
const { PrismaClient, Prisma } = require('@prisma/client');
const prisma = new PrismaClient();
const app = express();
app.use(cors());
// adiciona users para teste
app.post('/users', async (req, res) => {
const newUser = await prisma.user.create({
data: {
id: 1,
name: 'John Doe',
email: 'john.doe@example.com',
password: 'password123',
},
});
res.json(newUser);
});
// retorna users
app.get('/users', async (req, res) => {
const users = await prisma.user.findMany();
res.json(users);
});
// remover users
app.delete('/users', async (req, res) => {
const users = await prisma.user.deleteMany();
res.json(users);
});
// Configuração do multer para salvar as imagens no diretório "uploads"
const storage = multer.diskStorage({
destination: './uploads',
filename: (req, file, cb) => {
cb(null, Date.now() + '-' + file.originalname);
}
});
const upload = multer({ storage });
// Rota para receber a imagem e salvar no banco de dados
app.post('/users/:id/image', upload.single('image'), async (req, res) => {
const { id } = req.params;
const { buffer } = req.file;
try {
const updatedUser = await prisma.user.update({
where: { id: Number(id) },
data: { image: buffer },
});
res.json(updatedUser);
} catch (error) {
console.error(error);
res.status(500).send('Erro ao atualizar o usuário.');
}
});
app.listen(3000, () => console.log('Servidor iniciado na porta 3000'));
// Execute o comando para gerar a tabela
npx prisma migrate dev
// Execute o comando para iniciar o projeto
npm start
Espero que ajude.
Gostei bastante muito obrigado, mas depois eu preciso pegar essas imagens do DB para exibir novamente no front, como eu iria fazer?
Salvar imagens no banco de dados não é uma boa prática. Apesar de ser possível, bancos de dados relacionais tradicionais não são os melhores locais para armazenar e recuperar esse tipo de dado.
O caminho mais básico utilizado é salvar a imagem ou qualquer arquivo (música, texto, video...) em algum local em disco e gravar na base de dados apenas o caminho desse arquivo em disco. Além disso, seu servidor deve servir esses arquivos como arquivos estáticos.
Mesmo assim, não é o melhor dos cenários, em aplicações reais você deve salvar esses arquivos binários em serviçoa como amazon S3 ou similar.