前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文:用Laravel的方式管理服务器的文件们

3分钟短文:用Laravel的方式管理服务器的文件们

作者头像
程序员小助手
发布2020-09-21 15:34:13
1.4K0
发布2020-09-21 15:34:13
举报
文章被收录于专栏:程序员小助手程序员小助手

引言

如果我们的应用程序接收用户提交的许多静态文件,文档,图片等等,需要将其上传到服务器并进行有效地管理。

然而,文件类型繁多,文件用途不同;还有可能我们使用第三方的对象存储服务,需要像访问本地文件一样地读取远端的文件。

如果有一套统一的API,或者操作风格,那样会节省很多不必要的差异化代码。laravel提供的Storage文档存储管理正式因此产生的,本期我们就来说一说。

代码时间

首先在配置文件内声明各个磁盘配置,可以设置驱动,配置目录等差异化信息。在 config/filesystem.php 文件内添加如下配置代码:

代码语言:javascript
复制
'disks' => [
    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],
    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'visibility' => 'public',
    ],
    's3' => [
        'driver' => 's3',
        'key' => 'your-key',
        'secret' => 'your-secret',
        'region' => 'your-region',
        'bucket' => 'your-bucket',
    ],
],

其中 driverlocal 时,表示本地的文件系统驱动。

如果要把 storage 目录下的公用目录 public 公开到网络可访问位置,我们为其创建一个软连接:

代码语言:javascript
复制
php artisan storage:link

这样就把目录 public 指向了 storage/app/public 目录。那么位于该目录下的所有文件,可通过web服务器的根目录直接访问。

文件操作

laravel提供的Storage文件操作类,封装了非常方便的文件读写和高级的功能操作。比如读取一个文件的内容:

代码语言:javascript
复制
Storage::disk('s3')->get('file.jpg');

上述代码,读取s3服务上的一个图片文件。

覆盖性写入一个文件,或者创建一个新的不存在的文件,使用 put 方式:

代码语言:javascript
复制
Storage::disk('local')->put('file.jpg', $contentsOrStream)

或者把上传的文件,直接放入到某个指定的目录:

代码语言:javascript
复制
Storage::putFile('myDir', $file)

其中 $file 是一个 Illuminate\Http\File or Illuminate\Http\UploadedFile 对象的实例。我们通过表单上传的file字段文件,可以使用

代码语言:javascript
复制
request()->file('file_field')

方便地获取。还有常用的判断文件是否存在:

代码语言:javascript
复制
Storage::exists('file.jpg')

避免了我们写 file_exists 这样还有传入绝对路径,或者相对路径的麻烦,使用对象方法操作,使得代码风格更为统一。

还有常用的一些方法,我们不一一解释了,罗列在下方:

  • 文件复制 copy('file.jpg', 'newfile.jpg')
  • 文件重命名 move('file.jpg', 'newfile.jpg')
  • 文件头部追加内容 prepend('my.log', 'log text')
  • 文件尾部追加内容 append('my.log', 'log text')
  • 删除文件 delete('file.jpg')

等等等等,读者可以自定查看文档或在源码中研读。

如果我们引入了一个第三方的文件存储服务,且有其一套API操作方式,而laravel系统并未提供该服务的驱动,能否自定义一套呢?完全可以。

框架的文件系统驱动使用了 Flysystem 库用于统一化管理。我们只需要扩展Storage,并将第三方的驱动API实现Storage接口方法即可在程序内无差别地使用了。

AppServiceProviderboot 方法内实现该扩展。比如我们引入 dropbox 存储服务:

代码语言:javascript
复制
Storage::extend('dropbox', function ($app, $config) {
    $client = new DropboxClient(
        $config['accessToken'], $config['clientIdentifier']
    );
    return new Filesystem(new DropboxAdapter($client));
});

我们使用Dropbox公司提供的 PHP SDK,或者使用composer安装相关包,在扩展方法中注册该驱动引擎即可。

写在最后

本文初步介绍了laravel中是如何使用Storage对象无差别地执行文件操作,用户只需关注文件操作逻辑,而不用在意底层的驱动方式,这样非常便于统一化。最后简介了引入自定义文件驱动的方法。

Happy coding :-)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 代码时间
  • 文件操作
  • 写在最后
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档