GridFS 文件系统
Overview
您可以使用适用于 Flysystem 的 GridFS适配器在MongoDB中存储大型文件。GridFS允许您存储无限大小的文件与数据存储在同一数据库中。
配置
在使用GridFS驾驶员之前,请运行以下命令,通过 Composer包管理器安装 Flysystem GridFS包:
composer require league/flysystem-gridfs
配置 Laravel 文件存储 gridfs
在 中使用config/filesystems.php
驾驶员:
'disks' => [ 'gridfs' => [ 'driver' => 'gridfs', 'connection' => 'mongodb', // 'database' => null, // 'bucket' => 'fs', // 'prefix' => '', // 'read-only' => false, // 'throw' => false, ], ],
您可以在config/filesystems.php
中配置以下设置:
设置 | 说明 |
---|---|
driver | 必需。 指定要使用的文件系统驾驶员。 对于MongoDB,必须为 gridfs 。 |
connection | 用于存储作业的数据库连接。 它必须是 mongodb 连接。 如果未指定连接,则驾驶员将使用默认连接。 |
database | GridFS存储桶的MongoDB 数据库名称。 如果未指定数据库,驾驶员将使用连接的数据库。 |
bucket | GridFS存储桶的名称或实例。 一个数据库可以包含多个存储桶,通过其名称进行标识。 默认为 fs 。 |
prefix | 指定存储桶中存储的文件的名称前缀。 建议使用不同的存储桶,而不是使用前缀,以便将文件存储在不同的集合中。 前缀不应以前导斜杠 ( / ) 开头。 |
read-only | 如果为 true ,则禁用写入GridFS存储桶。 写入操作将返回false 或抛出异常,具体取决于throw 的配置。 默认为false 。 |
throw |
|
您还可以使用工厂或服务名称来创建MongoDB\GridFS\Bucket
的实例。 在这种情况下,选项connection
和database
将被忽略:
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, ]); }, ], ],
使用
Laravel Filesystem 为所有支持的文件系统提供了一个通用接口。 您可以按照与local
磁盘相同的方式使用gridfs
磁盘。
以下示例将文件写入gridfs
磁盘,然后读取该文件:
$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!
要学习;了解Laravel 文件存储的更多信息,请参阅 Laravel 文件存储 在 Laravel 文档中。
版本控制
GridFS为每个上传的文件创建文件文档。 这些文档包含元数据,包括文件名和唯一的 ObjectId。 如果多个文档股票相同的文件名,则它们被视为“修订”,并通过创建时间戳进一步区分。
Laravel MongoDB集成使用GridFS Flysystem 适配器。 它通过以下方式与文件修订交互:
读取文件会读取此文件名的最新修订版本
写入文件会创建此文件名的新修订版本
重命名文件会重命名该文件的所有修订版本
删除文件会删除此文件名的所有修订版本
Flysystem 的GridFS适配器不提供对文件名的特定修订版的访问权限。 如果需要使用修订版本,则必须使用GridFS API ,如以下代码所示:
// 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])
注意
如果指定prefix
文件系统设置,则在直接使用GridFS API时必须显式添加文件名。