Menu Docs
Página inicial do Docs
/ / /
Manual da Biblioteca PHP
/

Armazenar arquivos grandes

Neste guia, você pode aprender como armazenar e recuperar arquivos grandes no MongoDB usando GridFS. O GridFS é uma especificação implementada pela Biblioteca PHP do MongoDB que descreve como divisão os arquivos em blocos ao armazená-los e remontá-los ao recuperá-los. A implementação do GridFS da biblioteca é uma abstração que gerencia as operações e a organização do armazenamento de arquivos.

Use o GridFS se o tamanho dos seus arquivos exceder o limite de tamanho de documento BSON de 16MB. Para obter informações mais detalhadas sobre se o GridFS é adequado para seu caso de uso, consulte GridFS no manual do MongoDB Server .

O GridFS organiza os arquivos em um bucket, um grupo de coleções do MongoDB que contém os blocos de arquivos e as informações que os descrevem. O bloco contém as seguintes coleções, nomeadas usando a convenção definida na especificação do GridFS:

  • A coleção chunks armazena os blocos de arquivo binário.

  • A coleção files armazena os metadados do arquivo.

Quando você cria um novo bloco GridFS , a biblioteca cria as coleções anteriores, prefixadas com o nome de bloco padrão fs, a menos que você especifique um nome diferente. A biblioteca também cria um índice em cada coleção para garantir a recuperação eficiente dos arquivos e metadados relacionados. A biblioteca cria o GridFS , se ele não existir, somente quando a primeira operação de gravação é executada. A biblioteca cria índices somente se eles não existirem e quando o bloco estiver vazio. Para obter mais informações sobre os índices do GridFS , consulte Índices do GridFS no manual do MongoDB Server .

Ao usar o GridFS para armazenar arquivos, a biblioteca divide os arquivos em partes menores, cada um representado por um documento separado na coleção chunks. Ele também cria um documento na coleção files que contém um ID de arquivo, nome de arquivo e outros metadados de arquivo. Você pode fazer upload do arquivo passando um stream para a Biblioteca PHP do MongoDB para consumir ou criar um novo stream e escrever diretamente nele. Para saber mais sobre fluxos, consulte Fluxos no manual do PHP.

Visualize o diagrama a seguir para ver como o GridFS divide os arquivos quando carregados em um bucket:

Um diagrama que mostra como o GridFS carrega um arquivo em um bloco

Ao recuperar arquivos, o GridFS obtém os metadados da coleção files no bloco especificado e utiliza as informações para reconstruir o arquivo a partir de documentos na coleção chunks . Você pode ler o arquivo gravando seu conteúdo em um fluxo existente ou criando um novo fluxo que aponte para o arquivo.

Para armazenar ou recuperar arquivos do GridFS, chame o método MongoDB\Database::selectGridFSBucket() no seu banco de dados de dados. Este método acessa um bucket existente ou cria um novo bucket se não existir.

O exemplo seguinte chama o método selectGridFSBucket() no banco de dados de dados do db :

$bucket = $client->db->selectGridFSBucket();

Você pode personalizar a configuração do bucket GridFS passando uma array que especifica valores de opção para o método selectGridFSBucket() . A tabela a seguir descreve algumas opções que você pode definir na array:

Opção
Descrição

bucketName

Specifies the bucket name to use as a prefix for the files and chunks collections. The default value is 'fs'.
Type: string

chunkSizeBytes

Specifies the chunk size that GridFS splits files into. The default value is 261120.
Type: integer

readConcern

Specifies the read concern to use for bucket operations. The default value is the database's read concern.
Type: MongoDB\Driver\ReadConcern

readPreference

Specifies the read preference to use for bucket operations. The default value is the database's read preference.
Type: MongoDB\Driver\ReadPreference

writeConcern

Specifies the write concern to use for bucket operations. The default value is the database's write concern.
Type: MongoDB\Driver\WriteConcern

O exemplo a seguir cria um bucket chamado 'myCustomBucket' passando uma array para selectGridFSBucket() que define a opção bucketName :

$customBucket = $client->db->selectGridFSBucket(
['bucketName' => 'myCustomBucket'],
);

Você pode fazer upload de arquivos para um bucket GridFS usando os seguintes métodos:

  • MongoDB\GridFS\Bucket::openUploadStream(): abre um novo fluxo de upload para o qual você pode escrever conteúdo de arquivo

  • MongoDB\GridFS\Bucket::uploadFromStream(): carrega o conteúdo de um fluxo existente em um arquivo GridFS

Utilize o método openUploadStream() para criar um fluxo de upload para um determinado nome de arquivo. O método openUploadStream() permite a você especificar informações de configuração em uma array de opções, que você pode passar como um parâmetro.

Este exemplo usa um fluxo de upload para executar as seguintes ações:

  • Abre um fluxo gravável para um novo arquivo GridFS chamado 'my_file'

  • Define a opção metadata em um parâmetro de array para o método openUploadStream()

  • Chama o método fwrite() para gravar dados em 'my_file', para o qual o stream aponta

  • Chama o método fclose() para fechar o fluxo apontando para 'my_file'

$stream = $bucket->openUploadStream('my_file', [
'metadata' => ['contentType' => 'text/plain'],
]);
fwrite($stream, 'Data to store');
fclose($stream);

Utilize o método uploadFromStream() para carregar o conteúdo de um stream para um novo arquivo GridFS . O método uploadFromStream() permite a você especificar informações de configuração em uma array de opções, que você pode passar como um parâmetro.

Este exemplo executa as seguintes ações:

  • Chama o método fopen() para abrir um arquivo localizado em /path/to/input_file como um fluxo no modo de leitura binária (rb)

  • Chama o método uploadFromStream() para carregar o conteúdo do stream para um arquivo GridFS chamado 'new_file'

$file = fopen('/path/to/input_file', 'rb');
$bucket->uploadFromStream('new_file', $file);

Nesta seção, você pode aprender como recuperar metadados de arquivo armazenados na coleção files do contêiner GridFS. Os metadados contêm informações sobre o arquivo a que se refere, incluindo:

  • O _id do arquivo

  • O nome do arquivo

  • O tamanho/comprimento do arquivo

  • A data e a hora do carregamento

  • Um documento metadata no qual você pode armazenar qualquer outra informação

Para recuperar arquivos de um GridFS , chame o método MongoDB\GridFS\Bucket::find() na instância do MongoDB\GridFS\Bucket . O método retorna uma instância do MongoDB\Driver\Cursor da qual você pode acessar os resultados. Para saber mais sobre Cursor objetos na biblioteca MongoDB PHP, consulte o guia Acessar dados de um cursor .

O seguinte exemplo de código mostra como recuperar e imprimir metadados de arquivo de arquivos em um bucket GridFS . Ele usa um loop foreach para iterar pelo cursor retornado e exibir o conteúdo dos arquivos carregados nos exemplos de Arquivos de upload :

$files = $bucket->find();
foreach ($files as $fileDocument) {
echo toJSON($fileDocument), PHP_EOL;
}
{ "_id" : { "$oid" : "..." }, "chunkSize" : 261120, "filename" : "my_file",
"length" : 13, "uploadDate" : { ... }, "metadata" : {
"contentType" : "text/plain" } }
{ "_id" : { "$oid" : "..." }, "chunkSize" : 261120, "filename" : "new_file",
"length" : 13, "uploadDate" : { ... } }

O método find() aceita várias especificações de query. Você pode usar seu parâmetro $options para especificar a ordem de classificação, o número máximo de documentos a serem retornados e o número de documentos a serem ignorados antes de retornar. Para visualizar uma lista de opções disponíveis, consulte a documentação da API.

Observação

O exemplo anterior chama o método toJSON() para imprimir metadados de arquivo como JSON estendido, definido no código a seguir:

function toJSON(object $document): string
{
return MongoDB\BSON\Document::fromPHP($document)->toRelaxedExtendedJSON();
}

Você pode baixar arquivos de um bucket GridFS usando os seguintes métodos:

  • MongoDB\GridFS\Bucket::openDownloadStreamByName() ou MongoDB\GridFS\Bucket::openDownloadStream(): abre um novo fluxo de download do qual você pode ler o conteúdo do arquivo

  • MongoDB\GridFS\Bucket::downloadToStream(): grava o arquivo inteiro em um fluxo de download existente

Você pode baixar arquivos do seu banco de banco de dados MongoDB utilizando o método MongoDB\GridFS\Bucket::openDownloadStreamByName() para criar um stream de download.

Este exemplo usa um fluxo de download para executar as seguintes ações:

  • Seleciona um arquivo GridFS chamado 'my_file', carregado no exemplo de Gravação em um Fluxo de Carregamento , e o abre como um fluxo legível

  • Chama o método stream_get_contents() para ler o conteúdo de 'my_file'

  • Imprime o conteúdo do arquivo

  • Chama o método fclose() para fechar o fluxo de download apontando para 'my_file'

$stream = $bucket->openDownloadStreamByName('my_file');
$contents = stream_get_contents($stream);
echo $contents, PHP_EOL;
fclose($stream);
"Data to store"

Observação

Se houver vários documentos com o mesmo nome de arquivo, o GridFS transmitirá o arquivo mais recente com o nome fornecido (conforme determinado pelo campo uploadDate ).

Alternativamente, você pode utilizar o método MongoDB\GridFS\Bucket::openDownloadStream(), que utiliza o campo _id de um arquivo como um parâmetro:

$stream = $bucket->openDownloadStream(new ObjectId('66e0a5487c880f844c0a32b1'));
$contents = stream_get_contents($stream);
fclose($stream);

Observação

A API de streaming do GridFS não pode carregar blocos parciais. Quando um fluxo de download precisa extrair um bloco do MongoDB, ele puxa todo o bloco para a memória. O tamanho padrão do bloco de 255-kilobytes geralmente é suficiente, mas você pode reduzir o tamanho do bloco para reduzir a sobrecarga de memória ou aumentar o tamanho do bloco ao trabalhar com arquivos maiores. Para obter mais informações sobre como definir o tamanho do bloco, consulte a seção Personalizar o bloco desta página.

Quando seu bucket contém vários arquivos com o mesmo nome de arquivo, o GridFS escolhe a versão carregada mais recentemente do arquivo por padrão. Para diferenciar os arquivos que têm o mesmo nome, o GridFS atribui a eles um número de revisão, ordenado por tempo de carregamento.

O número de revisão do arquivo original é 0 e o próximo número de revisão de arquivo mais recente é 1. Você também pode especificar valores negativos que correspondem à recência da revisão. O valor de revisão -1 faz referência à revisão mais recente e -2 faz referência à próxima revisão mais recente.

Você pode instruir o GridFS a baixar uma revisão de arquivo específica passando uma array de opções para o método openDownloadStreamByName() e especificando a opção revision . O exemplo a seguir lê o conteúdo do arquivo original chamado 'my_file' em vez da revisão mais recente:

$stream = $bucket->openDownloadStreamByName('my_file', ['revision' => 0]);
$contents = stream_get_contents($stream);
fclose($stream);

Você pode baixar o conteúdo de um arquivo GridFS para um fluxo existente ligando para o método MongoDB\GridFS\Bucket::downloadToStream() em seu bloco.

Este exemplo executa as seguintes ações:

  • Chama o método fopen() para abrir um arquivo localizado em /path/to/output_file como um fluxo no modo de gravação binária (wb)

  • Baixa um arquivo GridFS que tem um valor _id de ObjectId('66e0a5487c880f844c0a32b1') para o fluxo

$file = fopen('/path/to/output_file', 'wb');
$bucket->downloadToStream(
new ObjectId('66e0a5487c880f844c0a32b1'),
$file,
);

Utilize o método MongoDB\GridFS\Bucket::rename() para atualizar o nome de um arquivo GridFS em seu bucket. Passe os seguintes parâmetros para o método rename():

  • _id valor do arquivo que você deseja renomear

  • Novo nome do arquivo

O exemplo a seguir mostra como atualizar o campo filename para 'new_file_name' fazendo referência ao valor _id de um arquivo:

$bucket->rename(new ObjectId('66e0a5487c880f844c0a32b1'), 'new_file_name');

Alternativamente, você pode usar o método MongoDB\GridFS\Bucket::renameByName() para renomear um arquivo GridFS e todas as suas revisões de arquivo. Passe os seguintes parâmetros para o método renameByName():

  • filename valor que você deseja alterar

  • Novo nome do arquivo

O exemplo a seguir renomeia todos os arquivos que têm um filename valor de 'my_file':

$bucket->renameByName('my_file', 'new_file_name');

Use o método MongoDB\GridFS\Bucket::delete() para remover o documento de collection de um arquivo GridFS e os chunks associados do seu bucket. Isso exclui efetivamente o arquivo. Passe o valor _id do arquivo que você deseja excluir como parâmetro para o método delete().

O seguinte exemplo mostra como excluir um arquivo referenciando seu campo _id:

$bucket->delete(new ObjectId('66e0a5487c880f844c0a32b1'));

Alternativamente, você pode usar o método MongoDB\GridFS\Bucket::deleteByName() para excluir um arquivo GridFS e todas as suas revisões de arquivo. Passe o valor filename do arquivo que você deseja excluir como parâmetro para o método deleteByName(), conforme mostrado no código a seguir:

$bucket->deleteByName('my_file');

Para saber mais sobre como usar a biblioteca PHP do MongoDB para armazenar e recuperar arquivos grandes, consulte a seguinte documentação da API:

Voltar

Configurar operações CRUD

Nesta página