gridfs
Provavelmente não é a melhor maneira de implementar um sistema de armazenamento de arquivos

GridFS – o entendimento de um leigo

O MongoDB possui uma especificação de driver para carregar e recuperar arquivos dele, chamados GridFS. O GridFS permite armazenar e recuperar arquivos, incluindo arquivos que excedem o limite de tamanho de documento BSON de 16 MB.

O GridFS basicamente pega um arquivo e o divide em vários pedaços que são armazenados como documentos individuais em duas coleções:

  • a chunk coleção (armazena as partes do documento) e
  • a file coleção (armazena os metadados adicionais consequentes).

Cada pedaço é limitado a 255 KB de tamanho. Isso significa que o último pedaço normalmente é igual ou menor que 255 KB. Soa bem arrumado.

Quando você lê no GridFS, o driver remonta todos os pedaços, conforme necessário. Isso significa que você pode ler seções de um arquivo de acordo com o seu intervalo de consultas. Como ouvir um segmento de um arquivo de áudio ou buscar uma seção de um arquivo de vídeo.

Nota: É preferível usar o GridFS para armazenar arquivos que excedam normalmente o limite de tamanho de 16 MB. Para arquivos menores, é recomendável usar o formato BinData para armazenar os arquivos em documentos únicos.

Isso resume como o GridFS funciona em geral. Hora de mergulhar em algum código de trabalho e ver como implementar um sistema como tal.

Chega de conversa, mostre-me o código

Estamos usando o Node.js com acesso a uma instância de nuvem do MongoDB para nossa configuração. Você pode encontrar o repositório de códigos para o aplicativo de amostra aqui.

tarique93102 / gridfs-file-storage

Contribua para o desenvolvimento tarique93102 / gridfs-file-storage criando uma conta no GitHub.

25858979?s=400&v=4

Vamos nos concentrar completamente nos segmentos do código relacionados às funcionalidades do GridFS. Aprenderemos como configurá-lo e usá-lo para armazenar arquivos, recuperar arquivos ou um arquivo específico e excluir um arquivo específico. Vamos começar então.

Inicialize o mecanismo de armazenamento

Os pacotes necessários para inicializar o mecanismo são multer-gridfs-storage e multer. Nós também usamos method-override middleware para ativar a operação de exclusão de arquivos. O módulo npm crypto é usado para criptografar os nomes de arquivos ao serem armazenados e lidos no banco de dados.

Depois que o mecanismo de armazenamento usando o GridFS for inicializado, basta chamá-lo usando o middleware multer. É então passado para a respectiva rota, executando as várias operações de armazenamento de arquivos.

server app 1

Inicializar fluxo do GridFS

Inicializamos um fluxo do GridFS como visto no código abaixo. O fluxo é necessário para ler os arquivos do banco de dados e também para ajudar a renderizar uma imagem em um navegador quando necessário.

server app 2

Carregar um único arquivo ou imagem

Reutilizamos o middleware de upload que criamos anteriormente.

Nota: O nome file é usado como um parâmetro em upload.single() já que temos a chave com um nome semelhante, carregando o arquivo que está sendo enviado do cliente.

server app 4

Carregar vários arquivos ou imagens

Também podemos fazer upload de vários arquivos de uma só vez. Ao invés de upload.single(), temos que simplesmente usar upload.multiple().

Nota: O número de arquivos enviados pode ser menor que o número definido de arquivos.

server app 5

Buscar todos os arquivos do banco de dados

Usando o fluxo inicializado, podemos buscar todos os arquivos no banco de dados específico usando gfs.find().toArray(...). Depois que os arquivos são obtidos, mapeamos para uma matriz e enviamos a resposta.

server app 6

Buscar um único arquivo por nome de arquivo

É super simples consultar o GridFS em busca de um único arquivo com base em um atributo específico, como filename. Usando o fluxo GridFS, você pode consultar o banco de dados através da função gfs.find({}).

server app 7

Renderizar uma imagem coletada no navegador

Essa é uma parte um pouco mais complicada, pois é necessário não apenas buscar um arquivo no banco de dados, mas também renderizá-lo como uma imagem no respectivo navegador. Buscamos o arquivo normalmente. Nenhuma mudança nesse processo.

Então, com a ajuda do método openDownloadStreamByName() no fluxo gfs, podemos renderizar facilmente uma imagem, pois ela retorna um fluxo legível. Feito isso, podemos usar JavaScript pipe() para transmitir a resposta.

server app 8

Excluir um arquivo específico por ID

A exclusão de um arquivo é igualmente simples. Nós usamos o método stream delete() com _id parâmetro para consultar e excluir o arquivo em questão.

server app 9

Essas são as principais funcionalidades oferecidas pelo design do mecanismo de armazenamento. Eu aproveitei os recursos do GridFS discutidos para criar um aplicativo simples de upload de imagens. Você pode se aprofundar no código no diretório repositório.

Conclusão

Levei algum tempo e um esforço considerável para entender como usar o GridFS para um projeto pessoal. Por causa disso, eu queria ter certeza de que pelo menos uma outra pessoa não tivesse que investir a mesma quantidade de tempo.

Dito isto, eu recomendaria usar o GridFS com cautela. Não é um bala de prata para todas as suas preocupações de armazenamento de arquivos. Ainda assim, é uma especificação bacana para conhecer e estar ciente.

Se você tiver alguma dúvida ou preocupação, pode comentar na postagem ou entrar em contato comigo no LinkedIn.

Enquanto isso, continue codificando.