扩展 Laravel 中的 Filesystem / Cloud Storage,加上 MongoGridFS 驱动

我们的文件存储要求必须是分布式文件存储,所以大多数情况下,我们都是用了 Mogilefs 和 MongoGridFS。在一些大的场景下我们都用 Mogilefs,一些小的场景下用的 MongoGridFS。主要是应为 Mogilefs 部署起来比较复杂,还要依赖 mysql,我们数据库主要使用 mongodb,为此还专门部署 mysql。而 MongoGridFS 相对来说简单一些,mongo 本身就支持,做成副本集都可以达到分布式文件存储的效果。

在 laravel 的项目中要使用 MongoGridFS 怎么办呢?一种是在需要的时候直接 new MongoGridFS,但是这种方法太不优雅,还是扩展 Laravel 中的 Filesystem / Cloud Storage 吧。

按照官方文档一步一步来吧,首先创建一个 GridfsServiceProvider。在 GridfsServiceProvider 的 boot 方法中调用 Storage::extend,但是需要自己实现 GridFSAdapter。一开始想着照着 AwsS3Adapter 的样子实现一个吧,后来一想还是去找找是不是有现成的吧,于是在 packagist.org 中搜索 league/flysystem,还真找到了,league/flysystem-gridfs,那就简单了。执行 composer require league/flysystem-gridfs。然后修改 GridfsServiceProvider。加入 use。
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use League\Flysystem\GridFS\GridFSAdapter;
use Storage;
再修改:
Storage::extend('gridfs', function($app, $config) {
$uri = "mongodb://";
if(config('database.connections.mongodb.username')) {
$uri .= config('database.connections.mongodb.username').":";
$uri .= config('database.connections.mongodb.password')."@";
}
$uri .= config('database.connections.mongodb.host');
if(config('database.connections.mongodb.port')) {
$uri .= ":". config('database.connections.mongodb.port');
}
$options = [];
$client = new \MongoClient($uri,$options);
$gridFs = $client->selectDB(config('database.connections.mongodb.database'))->getGridFS();
return new Filesystem(new GridFSAdapter($gridFs));
});
我这里的 config 使用的是 mongodb 一样的配置,大家可以自行修改啊,还 $options 我也还没有来及加上,应该加上的,要不然实现不了副本集。GridfsServiceProvider 就写好了。
接下来修改 config 中的 filesystems.php, 在 disk 节点下加上:
'gridfs' => [
'driver' => 'gridfs',
],
到此,前端就可以直接使用 gridfs 了。下面是一个简单的例子。
$disk = \Storage::disk('gridfs');
if(!$disk->exists('test.txt')) {
$disk->put('test.txt', "sssssssss");
}
$content = $disk->get('test.txt');
if($content) {
echo $content;
}
页面可以打印出了字符串,证明也就可以读写成功。

file

我们再看看数据库吧。

file

数据库中也有数据了。大功告成。

superwen
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

楼主楼主~我想知道的是如何在 laravel 中使用 MongoDB 存储图片,我这里每次都提示没有 GridFS 这个方法

7年前 评论