ThinkPHP6使用七牛云存储,不改代码,改下配置就上七牛
2022-11-24 11:10:29
226
{{single.collect_count}}

ThinkPHP6使用七牛云存储,不改代码,改下配置就上七牛

介绍

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

开始接入

请先阅读ThinkPHP6文档,了解Tp6中flysystem的用法,Tp6文件上传

调用

可以如上面 演示,在调用时加上disk方法,传入相应的配置名,也可以修改filesystem.php配置文件,默认调用改为qiniu.

依赖

composer require overtrue/flysystem-qiniu
  • 1

配置

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,域名]],];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

封装

Tp6中对flysystem做了封装,主要是用工厂类调用和配置的调用,后面会介绍下原理,现在只需要这样做:
创建文件/extend/think/filesystem/driver/Qiniu.php.
严格按照这样创建,Tp6会自动加载.

<?phpnamespace think\filesystem\driver;use League\Flysystem\AdapterInterface;use think\filesystem\Driver;use Overtrue\Flysystem\Qiniu\QiniuAdapter;class Qiniuextends 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.

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}