Docs 菜单
Docs 主页
/ / /
Laravel MongoDB

GridFS 文件系统

您可以使用 适用于GridFS 的 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
如果为true ,则无法执行操作时会引发异常。 如果false
操作成功时返回true ,出错时返回false 。 默认为false

您还可以使用工厂或服务名称来创建MongoDB\GridFS\Bucket的实例。 在这种情况下,选项connectiondatabase将被忽略:

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时必须显式添加文件名。

后退

事务