NodeJs + Prisma + SqLite
Olá devs, estou fazendo uma aplicação nodejs + prisma, utilizando o sqlite como DB, e agora preciso armazenar imagens que irão vim do front-end para o DB, como faço isso?
Muitos bancos SQL tem suporte a dados do tipo binário(como no caso de uma imagem), no sqlite3 existe o tipo BLOB, que pode ser utilizado para salvar o conteúdo de uma imagem. Você pode definir um tabela que utiliza o tipo BLOB no prisma dessa forma:
// arquivo: schema.prisma
model Image {
id Int @id @default(autoincrement())
name @string
format @string @default("png")
content @bytes
}
Neste exemplo, o campo content
armazenaria o conteúdo da imagem. prisma-schema-reference#bytes.
Olá, qual é o servidor que você esta usando? Express, fastify(minha recomendação alias) ou outro?
Express e Fastify tem plugins pra isso!
Para express pode usar o express-upload. Se o site for pequeno apenas para testes ou que não tera muitos uploads
Para fastify use o fastify-formdata Se for maior e com mais uploads!
Agora se for o node sem frameworks Pode usar o Multer para poucos uploads
Se for muito uploads use o busboy.
OBS as imagens ficam na pasta do servidor e os dados dela são salvos no banco de dados! A parte mais importante é a localização e nome da imagem! Para vc recuperar depois e poder servir como uma imagem normal!
Abraços
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.