如何使用 Laravel 从存储中获取和删除文件?

How to get and delete files from storage using Laravel?

我正在构建一个求职应用程序,候选人用户可以在其中根据预先确定的问题上传自己的个人资料以及 3 个(快速,大约 30 秒)视频。例如,其中一个问题是“1. 是什么让您在其他候选人中脱颖而出?”。他可以录下自己回答问题然后上传视频。

我的系统工作方式是,视频被上传到我创建的 tmp 磁盘和视频文件夹中,然后文件被上传到 s3。 发生这种情况后,我想从 tmp 文件夹中删除文件,但我不断收到错误消息。

这是 config/filesystems 中的 tmp 磁盘。php:

'tmp' => [
            'driver' => 'local',
            'root' => storage_path(),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public'

        ],

我认为我的应用程序中可能存在错误,因为我无法从此位置删除任何文件,事实上我什至无法获取它们。

当我尝试获取一个文件并将其转储时,我知道它位于 storage/videos/ 文件夹中,如下所示:

dd(Storage::get(storage_path().'/videos/1607107892Pexels-Videos-1181911-copy.mp4'));

当我点击响应中的网络选项卡时,它显示 No response data

如果我尝试删除这样的文件:

Storage::delete(storage_path().'/videos/1607107892Pexels-Videos-1181911-copy.mp4'));

我不断收到此错误:

League\Flysystem\FileNotFoundException: File not found at path: videos/1607107892Pexels-Videos-1181911-copy.mp4 in /Applications/XAMPP/xamppfiles/htdocs/highrjobsadminlte/vendor/league/flysystem/src/Filesystem.php:389

我做错了什么?

使用存储门面获取文件

您可以使用Storage facade 指定磁盘,然后获取您想要的文件。类似下面的代码可能对您有所帮助:

Storage::disk('tmp')->get('videos/1607107892Pexels-Videos-1181911-copy.mp4')

使用外观删除文件

如获取文件部分所述,您可以在指定 disk 后删除任何文件或目录。

Storage::disk('tmp')->delete('videos/1607107892Pexels-Videos-1181911-copy.mp4')

检查可用的目录和文件

如果您怀疑自己是否在正确的磁盘中,您可以使用allDirectories()allFiles()方法检查目标磁盘中的现有目录和文件。

Storage::disk('tmp')->allDirectories();
Storage::disk('tmp')->allFiles();

文件系统使用的默认磁盘在config/filesystems.php

中配置
'default' => env('FILESYSTEM_DRIVER', 'local'),

'disks' => [
//other disks
    'local' => [
        'driver' => 'local',
        'root'   => storage_path('app'),
   ],
//...
]

但是您在存储文件时使用自定义磁盘 tmp 并将其根设置为 storage_path() 而默认 local 磁盘的根路径设置为 storage_path('app')

所以为了删除 tmp 磁盘中的文件,您应该指定磁盘

Storage::disk('tmp')->delete('/videos/1607107892Pexels-Videos-1181911-copy.mp4');