Primeiramente nós devemos saber que essa nem sempre pode ser a melhor alternativa, ainda podemos utilizar o serviço S3 da Amazon, este guia serve apenas como uma alternativa interessante a se pensar.
Neste exemplo estaremos utilizando:
- Express 4.x
- NodeJS 5.x
Armazenando a imagem no banco
No exemplo abaixo, nós temos um serviço que recebe a imagem em base64
, transforma em binário e salva no banco:
1 | var GridStore = require('mongodb').GridStore; |
1 | var fs = require('fs'); |
Criando a instância do GridStore
No primeiro parâmetro nós passamos a ligação para a conexão com o banco de dados (que você receberá logo após um require('mongodb').MongoClient.connect()
), no segundo parâmetro nós definimos o nome do arquivo e por último nós definimos o que vamos fazer nesse documento, no nosso caso, vamos ler. Portanto w
que vem de write
:)
Gerando o nome do arquivo
Você pode notar na linha 13
do exemplo acima que o nome do arquivo que vamos guardar é criado pela função anônima na propriedade nextFileId
do FileManager
. Ele retorna algo como:
1 | c9R9_B7xgEVxQ_u7nCsX |
É apenas para termos certeza de que nenhum arquivo fique com nomes iguais e que possamos colocar isso numa url sem que fique na cara que utilizamos MongoDB:
1 | https://api.dominio.com.br/images/c9R9_B7xgEVxQ_u7nOX9.png |
Mas nada te impede de usar um ObjectId
, we’re talking about Mongo, right? :)
Escrevendo no arquivo
Na linha 19
nós armazenamos os dados da imagem na instância, mas caso você não execute o gridStore.close()
como na linha 22
, ele não será salvo no banco e ficará apenas na instância. Então é sempre importante executar um gridStore.close()
após o gridStore.write()
. O parâmetro que colocamos em write()
pode ser um Buffer
ou uma String
Lendo a imagem previamente armazenada
Para acessarmos a imagem que salvamos, vamos precisar de utilizar novamente a classe GridStore, só que dessa vez não precisaremos criar outra instância, mas definitivamente vamos precisar do id do arquivo que armazenamos, portanto é importante que você saiba que é necessário guardar a identificação do arquivo para que você possa acessá-la futuramente.
1 | var Q = require('q'), |
1 | class AlbumController { |
Criando um endpoint
Eu acredito que essa seja a parte mais simples de tudo: Criar um endpoint em que você possa requisitar a sua imagem apartir do seu site.
1 | var EXT_REMOVE_REGEX = /\.([A-z]+)$/; |
Espero que tenham gostado, deixem suas opiniões e dúvidas abaixo. Até a próxima.