多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## ThinkPHP6使用七牛云存储,不改代码,改下配置就上七牛 [TOC] ### 介绍 `ThinkPHP6`中使用`flysystem`作为文件处理类,`flysystem`是一个php文件处理库,可以使用相同的接口连接本地,ftp,ssh,dav,国外的各种oss,国内的各种oss等等,具体的可以搜索了解下. `ThinkPHP6`官方提供了本地的`flysystem`接入使用,但是没有提供七牛云的使用,实际上,flysystem也没有提供七牛云的接口,不过强大的php社区生态库中,有人提供了七牛云接口(`overtrue/flysystem-qiniu`),可以直接使用. 实际上你完全可以只用这个接口去做文件处理,但是为了使代码中文件操作统一,还是用统一的方式最好,本文就是介绍如何使用七牛云存储,最终效果如下: ``` //官方文档的使用方式 $savename = \think\facade\Filesystem::putFile( 'topic', $file); //接入七牛云的使用方式 $savename = \think\facade\Filesystem::disk('qiniu')->putFile('topic',$file); // 两个返回的文件名均如下,不过第二个是在七牛云上 topic/20190728/1091d43200fdb27524311cf0dc2408d3.jpg ``` ### 开始接入 请先阅读`ThinkPHP6`文档,了解Tp6中`flysystem`的用法,[Tp6文件上传](https://www.kancloud.cn/manual/ThinkPHP6_0/1037639) #### 调用 可以如上面 演示,在调用时加上`disk`方法,传入相应的配置名,也可以修改`filesystem.php`配置文件,默认调用改为`qiniu`. #### 依赖 ``` composer require overtrue/flysystem-qiniu ``` #### 配置 ``` return [ 'default' => Env::get('filesystem.driver', 'local'), 'disks' => [ 'local' => [ 'type' => 'local', 'root' => app()->getRuntimePath() . 'storage', ], 'public' => [ 'type' => 'local', 'root' => app()->getRootPath() . 'public/storage', 'url' => '/storage', 'visibility' => 'public', ], //增加下面配置项 'qiniu' =>[ //完全可以自定义的名称 'type'=>'qiniu', //可以自定义,实际上是类名小写 'accessKey' =>'d7FtmZgBzxxxQwEE', //七牛云的配置,accessKey 'secretKey'=>'lENEerxxxX9Us8DHtkDz8_HC',//七牛云的配置,secretKey 'bucket'=>'cwh5app', //七牛云的配置,bucket空间名 'domain'=>cwh5app.com' //七牛云的配置,domain,域名 ] ], ]; ``` #### 封装 Tp6中对`flysystem`做了封装,主要是用工厂类调用和配置的调用,后面会介绍下原理,现在只需要这样做: 创建文件`/extend/think/filesystem/driver/Qiniu.php`. 严格按照这样创建,Tp6会自动加载. ``` <?php namespace think\filesystem\driver; use League\Flysystem\AdapterInterface; use think\filesystem\Driver; use Overtrue\Flysystem\Qiniu\QiniuAdapter; class Qiniu extends Driver { protected function createAdapter(): AdapterInterface { return new QiniuAdapter( $this->config['accessKey'], $this->config['secretKey'], $this->config['bucket'], $this->config['domain'] ); } } ``` #### 完工 找个方法测试测试 ``` public function save(Request $request) { // 获取表单上传文件 例如上传了001.jpg $file = request()->file('file'); dump($file); $savename = Filesystem::disk('qiniu')->putFile('data',$file); dump($savename); } ``` ### 原理 Tp6中对`Filesystem`类做了封装,使用`facade`调用,实际上就是用工厂类生成对象. Tp6中,生成类之前会读取配置文件,找到打算实例化哪一个`驱动`,也就是配置文件中的`default`值,或者是传入的`disk`方法的参数. tp6提供了本地的方式,你可以在核心框架里找到这个`Local`驱动,如果我们想使用其他的驱动,那就要自己实现驱动,这个驱动返回一个基于`League\Flysystem\AdapterInterface`接口的对象即可. 所以如果我们想接入更多的存储系统,就添加更多的驱动即可. #### 关于命名空间 Tp6工厂生成`filesystem`对象时,会实例化`\\think\\filesystem\\driver\\`.`$config['type']`,也就是命名空间拼接配置中的类名. 命名空间和文件位置无关,所以php既可以找到位于核心类库中的`Local`驱动,也可以找到位于`extend`下的`Qiniu`驱动. ### 总结 这种方式还是十分方便的,可以随意接入更多的存储系统,无需修改任何代码. 当然,像七牛云,阿里OSS都有提供的浏览器直接上传到空间的jssdk,这种功能是没办法"统一"了. ### 额外 这个七牛的库,不仅实现了`flysystem`的功能,也可以`获取token`,`获取私链下载地址`等功能,属于扩展功能,可以去这里了解.[packagist](https://packagist.org/packages/overtrue/flysystem-qiniu).