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 GridFSTour.java no Github repositório do do 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 as implementações do Subscriber , que são descritas noPrimário de Início Rápidodo .

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

Atlas Searchgeoespacial