Menu Docs
Página inicial do Docs
/ / /
Driver de fluxos reativos do Java
/

GridFS

Nesta página

  • Pré-requisitos
  • Conecte-se a um MongoDB deployment
  • Crie um intervalo GridFS
  • Carregar no GridFS
  • Encontre arquivos armazenados no GridFS
  • Baixar do GridFS
  • Renomear arquivos
  • Excluir arquivos

GridFS é uma especificação para armazenar e recuperar arquivos que excedem o limite de tamanho do documento BSON de 16 MB. Em vez de armazenar um arquivo grande em um único documento, o GridFS divide um arquivo em partes, ou chunks, e armazena cada um desses chunks como documentos separados.

Quando você consulta um armazenamento GridFS para um arquivo, o driver reagrupa os blocos conforme necessário.

Os exemplos de código neste guia vêm do arquivo GridFSTour.java no repositório do GitHub de código-fonte do driver.

Você deve incluir as seguintes declarações de importação em seu programa para executar os exemplos de código neste guia:

import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoDatabase;
import com.mongodb.client.gridfs.model.*;
import com.mongodb.reactivestreams.client.gridfs.*;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import static com.mongodb.client.model.Filters.eq;
import static reactivestreams.helpers.PublisherHelpers.toPublisher;

Importante

Este guia usa implementações personalizadas de Subscriber , que são descritas no guia Implementações personalizadas de assinante .

Primeiro, conecte-se a um MongoDB deployment e declare e defina uma instância MongoDatabase .

O código a seguir se conecta a uma MongoDB deployment standalone em execução em localhost na porta 27017:

MongoClient mongoClient = MongoClients.create();

Para saber mais sobre como se conectar a sistemas do MongoDB, consulte o tutorial Conectar ao MongoDB .

O GridFS armazena arquivos em duas collections:

  • chunks: armazena os blocos de arquivo

  • files: armazena metadados do arquivo

As duas collections estão em um bucket comum e os nomes das collections são prefixados com o nome do bucket.

O driver fornece o método GridFSBuckets.create() para criar instâncias GridFSBucket :

MongoDatabase myDatabase = mongoClient.getDatabase("mydb");
// Create a gridFSBucket using the default bucket name "fs"
GridFSBucket gridFSBucket = GridFSBuckets.create(myDatabase);

Você pode passar um nome de bucket para o método GridFSBuckets.create() :

// Create a gridFSBucket with a custom bucket name "files"
GridFSBucket gridFSFilesBucket = GridFSBuckets.create(myDatabase, "files");

Observação

O GridFS cria automaticamente índices nas coleções files e chunks quando você carrega dados no contêiner GridFS.

O método GridFSBucket.uploadFromPublisher() lê o conteúdo de Publisher<ByteBuffer> e o salva na instância GridFSBucket .

Você pode usar o tipo GridFSUploadOptions para configurar o tamanho do chunk ou incluir metadados adicionais.

O exemplo a seguir carrega o conteúdo de um Publisher<ByteBuffer> em GridFSBucket:

// Get the input publisher
Publisher<ByteBuffer> publisherToUploadFrom = toPublisher(
ByteBuffer
.wrap("MongoDB Tutorial..".getBytes(StandardCharsets.UTF_8))
);
// Create some custom options
GridFSUploadOptions options = new GridFSUploadOptions()
.chunkSizeBytes(1024)
.metadata(new Document("type", "presentation"));
ObservableSubscriber<ObjectId> uploadSubscriber = new OperationSubscriber<>();
gridFSBucket.uploadFromPublisher("mongodb-tutorial", publisherToUploadFrom, options).subscribe(uploadSubscriber);
ObjectId fileId = uploadSubscriber.get().get(0);

Para localizar os arquivos armazenados no GridFSBucket, use o método find() .

O exemplo a seguir imprime o nome de cada arquivo armazenado:

ConsumerSubscriber<GridFSFile> filesSubscriber = new ConsumerSubscriber<>(gridFSFile ->
System.out.println(" - " + gridFSFile.getFilename()));
gridFSBucket.find().subscribe(filesSubscriber);
filesSubscriber.await();

Você também pode fornecer um filtro personalizado para limitar os resultados retornados. O exemplo a seguir imprime os nomes de todos os arquivos em que o valor contentType é um valor image/png no documento de metadados definido pelo usuário:

filesSubscriber = new ConsumerSubscriber<>(gridFSFile -> System.out.println("Found: " + gridFSFile.getFilename()));
gridFSBucket.find(eq("metadata.contentType", "image/png")).subscribe(filesSubscriber);
filesSubscriber.await();

O método downloadToPublisher() retorna um Publisher<ByteBuffer> que lê o conteúdo do MongoDB.

Para baixar um arquivo pelo _id, passe o _id para o método . O exemplo a seguir baixa um arquivo pelo arquivo _id:

ObjectId fileId;
ObservableSubscriber<ByteBuffer> downloadSubscriber = new OperationSubscriber<>();
gridFSBucket.downloadToPublisher(fileId).subscribe(downloadSubscriber);

Se você não souber o _id do arquivo, mas souber o nome do arquivo, poderá passar o nome do arquivo para o método downloadToPublisher() . Por padrão, ele baixará a versão mais recente do arquivo. Utilize a classe GridFSDownloadOptions para configurar qual versão baixar.

O exemplo a seguir baixa a versão original do arquivo chamado mongodb-tutorial:

GridFSDownloadOptions downloadOptions = new GridFSDownloadOptions().revision(0);
downloadSubscriber = new OperationSubscriber<>();
gridFSBucket.downloadToPublisher("mongodb-tutorial", downloadOptions).subscribe(downloadSubscriber);

Se você precisar renomear um arquivo, use o método rename() .

O exemplo a seguir renomeia um arquivo para mongodbTutorial:

ObjectId fileId; //ObjectId of a file uploaded to GridFS
gridFSBucket.rename(fileId, "mongodbTutorial").subscribe(new ObservableSubscriber<Void>());

Observação

O método rename() exige um ObjectId em vez de um filename para garantir que o arquivo correto seja renomeado.

Para renomear várias revisões do mesmo nome de arquivo, primeiro recupere a lista completa de arquivos. Em seguida, para cada arquivo que deve ser renomeado, execute rename() com o _id correspondente.

Para excluir um arquivo do GridFSBucket, utilize o método delete() .

O exemplo seguinte exclui um arquivo do GridFSBucket:

ObjectId fileId; //ObjectId of a file uploaded to GridFS
gridFSBucket.delete(fileId).subscribe(new ObservableSubscriber<Void>());

Voltar

Transações