扩展 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这个方法

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!