使用 Laravel 5.1 的文件系统对文件进行存储、移动和删除操作
Laravel 基于 Flysystem 提供了强大的文件系统对文件进行存储和删除,该文件系统和缓存一样,支持多种驱动,这些驱动包括本地驱动、FTP、Amazon S3以及 Rackspace,在这些驱动之上提供了统一的API方便随时切换驱动而不需要修改任何业务逻辑代码。
既然API方法一致,那么这里作为示例,我们使用本地驱动来演示如何使用文件系统API对文件进行存储和删除。
1、配置
文件系统配置位于config/filesystems.php,默认配置如下:
return [
'default' => 'local',
'cloud' => 's3',
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
],
'ftp' => [
'driver' => 'ftp',
'host' => 'ftp.example.com',
'username' => 'your-username',
'password' => 'your-password',
],
's3' => [
'driver' => 's3',
'key' => 'your-key',
'secret' => 'your-secret',
'region' => 'your-region',
'bucket' => 'your-bucket',
],
'rackspace' => [
'driver' => 'rackspace',
'username' => 'your-username',
'key' => 'your-key',
'container' => 'your-container',
'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/',
'region' => 'IAD',
'url_type' => 'publicURL',
],
],
];
从配置文件可以看出,Laravel默认的文件系统驱动是local,也就是本地驱动,默认的云存储是Amazon S3。我们可以修改这些默认配置。
所有支持的驱动及驱动详细配置定义在disks配置项中,在local驱动中使用root配置指定文件系统的根路径,即storage/app,这意味着如果使用local驱动,所有文件都会存放在该目录下。如果使用ftp驱动需要指定FTP主机、用户名和登录密码,此外还有一些额外配置,比如端口号、超时时间、加密方式等。同理使用s3或者rackspace也要填写相应的配置项。
由于我们使用local驱动,所以这里我们保持该配置文件不变即可。
2、基本使用
下面我们使用文件系统演示如何上传文件、获取文件、以及删除文件,我们将使用Storage门面提供的方法进行操作。
上传文件/获取文件
这里我们基于 HTTP 请求实例教程#上传文件这篇教程并对其上传方法postFileupload进行修改:
public function postFileupload(Request $request){
//判断请求中是否包含name=file的上传文件
if(!$request->hasFile('file')){
exit('上传文件为空!');
}
$file = $request->file('file');
//判断文件上传过程中是否出错
if(!$file->isValid()){
exit('文件上传出错!');
}
$newFileName = md5(time().rand(0,10000)).'.'.$file->getClientOriginalExtension();
$savePath = 'test/'.$newFileName;
$bytes = Storage::put(
$savePath,
file_get_contents($file->getRealPath())
);
if(!Storage::exists($savePath)){
exit('保存文件失败!');
}
header("Content-Type: ".Storage::mimeType($savePath));
echo Storage::get($savePath);
}
在上传处理逻辑中我们先保存文件到指定位置,然后判断保存后的文件是否存在,如果不存在则表明上传失败,否则显示上传文件内容。
比如我们测试上传图片,访问http://laravel.app:8000/request/fileupload,点击“选择文件”上传一张图片:

点击“提交”,页面显示出刚刚上传的图片:

好吧,插播一条广告:你可以扫上面这张图片二维码加入Laravel学院开设的Laravel学习交流群。
还可以上传文本文件:

点击“提交“,页面显示出文本文件内容:
test local storage
针对文本文件,你可以使用Storage门面提供的prepend/append方法在文本文件头部/尾部追加内容:
$filePath = 'test/ef5e49967bf4a5e2f386a3726f9213d2.txt'; Storage::prepend($filePath,'###'); Storage::append($filePath,'###'); echo Storage::get($filePath);
执行上述代码后,文本文档内容变为:
### test local storage ###
移动/删除文件
如果我们想要将某个文件复制/移动到别的目录下,可以使用Storage门面提供的copy/move方法:
Storage::copy('test/xxx.txt','files/xxx.txt ');
Storage::move('test/xxx,jpg','images/xxx.jpg');
如果想要删除某个文件,可以使用delete方法:
$filePath = 'test/ef5e49967bf4a5e2f386a3726f9213d2.txt';
if(Storage::delete($filePath)){
exit('删除成功!');
}else{
exit('删除失败!');
}
获取指定目录下所有文件/子目录
如果要获取某个目录下的所有文件,可以使用Storage门面提供的files或allFiles方法,两者的区别在于allFiles会返回所有嵌套子目录下的文件:
$filePath = 'test'; $files = Storage::Files($filePath); dd($files);
如果要获取子目录,可以使用directories或者allDirectories方法,同理,两者的区别在于后者可以返回嵌套的子目录:
$dirPath = 'test'; $directories = Storage::directories($dirPath); dd($directories);
由于test目录下没有子目录,所以打印结果为一个空数组。下面我们来看如何创建目录。
创建目录/删除目录
创建目录可以使用Storage门面提供的makeDirectory方法:
$dirPath = 'test/abc';
Storage::makeDirectory($dirPath);
$directories = Storage::directories('test');
dd($directories);
这样就可以打印出子目录数组,如果要删除这个子目录,可以使用deleteDirectory方法,该方法会递归删除子目录下所有文件及文件夹:
$dirPath = 'test/abc';
Storage::deleteDirectory($dirPath);
$directories = Storage::directories('test');
dd($directories);
这样打印出来的结果又为空了,说明子目录已经被删除。
想要了解更多Storage提供的方法,可查看该门面对应的底层Illuminate\Filesystem\Filesystem类。
11 条评论