3分钟短文:用Laravel的方式管理服务器的文件们
liuian 2025-07-14 18:24 50 浏览
引言
如果我们的应用程序接收用户提交的许多静态文件,文档,图片等等,需要将其上传到服务器并进行有效地管理。
然而,文件类型繁多,文件用途不同;还有可能我们使用第三方的对象存储服务,需要像访问本地文件一样地读取远端的文件。
如果有一套统一的API,或者操作风格,那样会节省很多不必要的差异化代码。laravel提供的Storage文档存储管理正式因此产生的,本期我们就来说一说。
代码时间
首先在配置文件内声明各个磁盘配置,可以设置驱动,配置目录等差异化信息。 在 config/filesystem.php 文件内添加如下配置代码:
'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',
],
],其中 driver 为 local 时,表示本地的文件系统驱动。
如果要把 storage 目录下的公用目录 public 公开到网络可访问位置, 我们为其创建一个软连接:
php artisan storage:link这样就把目录 public 指向了 storage/app/public 目录。那么位于该目录下的所有文件, 可通过web服务器的根目录直接访问。
文件操作
laravel提供的Storage文件操作类,封装了非常方便的文件读写和高级的功能操作。 比如读取一个文件的内容:
Storage::disk('s3')->get('file.jpg');上述代码,读取s3服务上的一个图片文件。
覆盖性写入一个文件,或者创建一个新的不存在的文件,使用 put 方式:
Storage::disk('local')->put('file.jpg', $contentsOrStream)或者把上传的文件,直接放入到某个指定的目录:
Storage::putFile('myDir', $file)其中 $file 是一个 Illuminate\Http\File or Illuminate\Http\UploadedFile 对象的实例。 我们通过表单上传的file字段文件,可以使用
request()->file('file_field')方便地获取。还有常用的判断文件是否存在:
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接口方法即可在程序内无差别地使用了。
在 AppServiceProvider 的 boot 方法内实现该扩展。比如我们引入 dropbox 存储服务:
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 :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。
相关推荐
- 苹果6怎么升级系统版本(苹果6怎么升级系统版本最高能到多少)
-
要是喜欢自己动手可以自己去官网上下载,新系统在更新,他只是不支持自动更新的。如果不想自己动手,可以去拼多多或者是淘宝里面找一找,多的是那种帮你刷新系统的。也就是一点点钱的事情。现在选择很多活人不会被尿...
- windows2003镜像32位下载(win2003系统镜像)
-
虚拟光驱装系统,(win7,xp通用)具体步骤一、将从网上下载的win7旗舰版ISO系统文件存放到D盘。二、从网上下载虚拟光驱,打开安装后在任务栏右通知区显示“虚拟DAEMON管理器”图标,在我的电脑...
- win10电脑自动更新怎么关闭(win10电脑怎么关闭自动更新系统)
-
win10老推送win11打开的方法步骤如下,1,首先,打开设置,点击更新和安全2,打开后,点击windows预览体验计划3,打开后,点击开始4,然后按流程进行注册5,注册完成后,点击选择帐户6,然后...
- window7下载steam(window7下载一键重装如何恢复网络)
-
回答如下:要在Windows7上下载Steam,您可以按照以下步骤操作:1.打开您的浏览器,访问Steam官网(https://store.steampowered.com)。2.点击页面右上角...
- 系统还原没有还原点怎么办(系统还原点不动怎么办)
-
如果电脑没有创建还原点,就不能使用系统还原来回到之前的状态。但是,可以尝试使用其他备份工具或软件来恢复数据或重建系统。比如,可以使用第三方备份软件来备份重要文件和数据。如果是系统出现问题,可以尝试重新...
- 正在准备windows(正在准备windows请勿关机怎么办)
-
这个情况在使用华为电脑时可能会遇到。一般来说,这是因为电脑正在进行系统更新或者安装软件程序等操作,导致启动时间较长。如果电脑显示“正在准备Windows,请勿关闭电源”,则说明电脑正在进行系统更新。...
-
- 有win10安装包怎么装系统(win10安装包安装教程)
-
如果是原版ISO镜像,可以加载到虚拟光驱直接安装。如果是第三方更改的就需要启动盘。个人建议用U盘启动盘来安装。下载一个u盘启动盘程序(优启通、大白菜……),按照提示把它安装到U盘。启动盘制作完毕以后,启动电脑安快捷键选择U盘启动。进入pe后...
-
2026-01-14 16:37 liuian
- gho怎么变成iso文件(gho改成iso)
-
要将GHO转换为ISO,您需要使用GHO映像转换器软件。以下是执行此操作的步骤:1.下载和安装GHO映像转换器软件。2.运行转换器软件,并单击“打开”按钮。3.在弹出窗口中,选择要转换的GHO...
- office和visio安装顺序(office和visio怎么一起安装)
-
在某些情况下,安装Visio可能会发生与Office365冲突的问题。这是因为Visio和Office365具有不同的版本,可能会导致安装时出现错误或兼容性问题。为了避免这种冲突,...
- 电脑中病毒的原因(电脑中病毒正常吗)
-
电脑中毒的原因有以下几方面:1.网页被挂病毒。2.电脑裸奔,无防病毒软件。3.执行一些不安全的程序。4.U盘等不安全介质。5.电脑漏洞不及时补,被后台种毒。为了电脑不中病毒要注意以下几方面:1.更新系...
- 手机psd转换成jpg最简单方式
-
可以使用photoshop工具,方法如下:1、首先打开PS软件,然后选择自己需要的JPG格式的图片,在PS中打开。2、接下来先按快捷键“Ctrl+j”将图片复制出来,防止后面操作对原图片有损...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
