GridFS 文件系统
概述
您可以使用Flysystem 的 GridFS 适配器 用于在 MongoDB 中存储大文件。GridFS 允许你在与数据相同的数据库中存储任意大小的文件。
配置
在使用 GridFS 驱动程序之前,通过运行以下命令使用 Composer 软件包管理器安装 Flysystem GridFS 包
composer require league/flysystem-gridfs
配置 Laravel 文件存储 以使用 gridfs
驱动程序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 | 网格FS存储桶的名称或实例。数据库可以包含多个通过名称标识的存储桶。默认为 fs 。 |
前缀 | 指定存储在存储桶中的文件的名称前缀。建议使用不同的存储桶来存储文件到不同的集合,而不是使用前缀。前缀不应以反斜杠开头( / )。 |
只读 | 如果设置为 true ,则禁用对GridFS存储桶的写入。写入操作将返回false 或根据throw 的配置抛出异常。默认为false 。 |
抛出 |
|
您还可以使用工厂或服务名称来创建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文件系统为所有支持的文件系统提供了一个通用的接口。您可以使用与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时显式地预置文件名。