Sistemas de arquivos GridFS
Visão geral
Você pode usar o adaptador GridFS para Flysystem para armazenar arquivos grandes no MongoDB. O GridFS permite armazenar arquivos de tamanho ilimitado no mesmo banco de dados de dados que seus dados.
Configuração
Antes de usar o driver GridFS , instale o pacote Flysystem GridFS através do gerenciador de pacote Composer executando o seguinte comando:
composer require league/flysystem-gridfs
Configurar armazenamento de arquivo Laravel para usar o gridfs
driver no config/filesystems.php
:
'disks' => [ 'gridfs' => [ 'driver' => 'gridfs', 'connection' => 'mongodb', // 'database' => null, // 'bucket' => 'fs', // 'prefix' => '', // 'read-only' => false, // 'throw' => false, ], ],
Você pode definir as seguintes configurações em config/filesystems.php
:
Contexto | Descrição |
---|---|
driver | Obrigatório. Especifica o driver do sistema de arquivos a ser usado. Deve ser gridfs para MongoDB. |
connection | Conexão do banco de dados usada para armazenar tarefas. Deve ser uma conexão mongodb . O driver usa a conexão padrão se nenhuma conexão for especificada. |
database | Nome do banco de banco de dados MongoDB para o bucket GridFS . O driver utiliza o banco de dados de dados da conexão se um banco de dados de dados não for especificado. |
bucket | Nome ou instância do bucket GridFS . Um banco de dados de dados pode conter vários buckets identificados por seu nome. Padrão é fs . |
prefix | Especifica um prefixo para o nome dos arquivos armazenados no bucket. O uso de um bucket distinto é recomendado para armazenar os arquivos em uma coleção diferente, em vez de usar um prefixo. O prefixo não deve começar com uma barra ( / ). |
read-only | Se true , a gravação no GridFS estará desabilitada. As operações de gravação retornarão false ou lançarão exceções , dependendo da configuração de throw . O padrão é false . |
throw |
|
Você também pode usar uma fábrica ou um nome de serviço para criar uma instância do MongoDB\GridFS\Bucket
. Neste caso, as opções connection
e database
são ignoradas:
use Illuminate\Foundation\Application; use MongoDB\GridFS\Bucket; 'disks' => [ 'gridfs' => [ 'driver' => 'gridfs', 'bucket' => static function (Application $app): Bucket { return $app['db']->connection('mongodb') ->getMongoDB() ->selectGridFSBucket([ 'bucketName' => 'avatars', 'chunkSizeBytes' => 261120, ]); }, ], ],
Uso
O Laravel Filesystem fornece uma interface comum para todos os sistemas de arquivos suportados. Você pode utilizar o disco gridfs
da mesma forma que o disco local
.
O exemplo a seguir grava um arquivo no disco gridfs
e lê o arquivo:
$disk = Storage::disk('gridfs'); // Write the file "hello.txt" into GridFS $disk->put('hello.txt', 'Hello World!'); // Read the file echo $disk->get('hello.txt'); // Hello World!
Para saber mais Armazenamento de arquivos Laravel, consulte Armazenamento de arquivos Laravel na documentação do Laravel.
Controle de Versão
O GridFS cria documentos de arquivo para cada arquivo carregado. Esses documentos contêm metadados, incluindo o nome do arquivo e um ObjectId exclusivo. Se vários documentos compartilharem o mesmo nome de arquivo, eles serão considerados "revisões" e ainda distinguidos pelos registros de data e hora da criação.
A integração do Laravel MongoDB usa o adaptador GridFS Flysystem. Ele interage com as revisões de arquivos das seguintes maneiras:
A leitura de um arquivo lê a última revisão deste nome de arquivo
Escrever um arquivo cria uma nova revisão para este nome de arquivo
Renomear um arquivo renomeia todas as revisões deste nome de arquivo
Excluir um arquivo exclui todas as revisões deste nome de arquivo
O adaptador GridFS para Flysystem não fornece acesso a uma revisão específica de um nome de arquivo. Você deve usar a API do GridFS se precisar trabalhar com revisões, conforme mostrado no código a seguir:
// Create a bucket service from the MongoDB connection /** @var \MongoDB\GridFS\Bucket $bucket */ $bucket = $app['db']->connection('mongodb')->getMongoDB()->selectGridFSBucket(); // Download the last but one version of a file $bucket->openDownloadStreamByName('hello.txt', ['revision' => -2])
Observação
Se você especificar a configuração prefix
do sistema de arquivos, terá que preceder explicitamente os nomes dos arquivos ao usar diretamente a API do GridFS .