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.
Pré-requisitos
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 Exemplos de implementações personalizadas de assinantes .
Conecte-se a um MongoDB deployment
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 .
Crie um intervalo GridFS
O GridFS armazena arquivos em duas collections:
chunks: armazena os blocos de arquivofiles: 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);Observação
O GridFS cria automaticamente índices nas coleções files e chunks quando você carrega dados no contêiner GridFS.
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");Dica
Configuração de tempo limite
Você pode usar a configuração de tempo limite de operação do lado do cliente (CSOT) para limitar o tempo em que o servidor pode concluir as operações GridFS . Para saber mais sobre como usar essa configuração com o GridFS, consulte a seção GridFS do guia Limitar o tempo de execução do servidor.
Carregar no 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 publisherPublisher<ByteBuffer> publisherToUploadFrom = toPublisher( ByteBuffer .wrap("MongoDB Tutorial..".getBytes(StandardCharsets.UTF_8)));
// Create some custom optionsGridFSUploadOptions 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);Encontre arquivos armazenados no GridFS
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();Baixar do GridFS
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);Renomear arquivos
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 GridFSgridFSBucket.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.
Excluir arquivos
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 GridFSgridFSBucket.delete(fileId).subscribe(new ObservableSubscriber<Void>());