如何使用Laravel的Storage Facade存储多个上传的文件

时间:2019-04-01 08:14:26

标签: php laravel

当前,我有一个正在运行Laravel 5.8的项目,并且我正在尝试使用一种允许用户将自己的图像上传到站点并将其存储在公用文件夹中的表单。尝试通过“ put”方法使用Storage Facade时,将返回路径,但实际上并不会存储图像。

if ($request->hasfile('images')) {
    foreach ($request->file('images') as $file) {
        $path = Storage::disk('public')->put('images', $file);
        echo $path;
    }
}

这是我尝试使用的代码。该路径将得到应有的回应,并且我尚未对文件系统配置进行任何更改。在表单中,输入字段图像允许提交多个文件,并且表单确实具有enctype="multipart/form-data"$file变量还包含Illuminate\Http\UploadedFile的实例。

我以前使用的有效代码是:

if ($request->hasfile('images')) {
    foreach ($request->file('images') as $file) {
        $file->move(public_path('images'), $file->getClientOriginalName());
    }
}

如果Laravel可以在上传时为其指定一个唯一的文件名,那么我可以使用以前的代码,但是是什么原因导致使用Storage Facade的代码无法正确保存图像? put函数是否不能像那样工作,或者我有什么地方可以忽略?

编辑: 因此,我意识到图像实际上可以正确保存。我正在查看public文件夹而不是storage文件夹,这就是为什么我的第二个代码示例“有效”但没有第一个代码示例的原因。我意识到使用Storage Facade时,如果要访问Web上的这些文件,则需要使用符号链接。

2 个答案:

答案 0 :(得分:2)

  if ($request->hasfile('images')) {
        foreach ($request->file('images') as $file) {
            $path = Storage::disk('public')->put('images', $file);
            $new_file_name = time() . "_" . uniqid() . "_" . $file->getClientOriginalName();
            $path = Storage::disk('public')->put($new_file_name, file_get_contents($file));
           echo $path;
       }
 }

答案 1 :(得分:1)

还需要确保已在Ubuntu服务器或Windows开发计算机上创建了指向存储文件夹的符号链接。

您可以使用Windows:mklink /j /path/to/laravel/public/youfolder /path/to/laravel/storage/youfolder

Ubuntu:ln -s /path/to/laravel/public/youfolder /path/to/laravel/storage/youfolder

要检查并设置,也可以使用php artisan storage:link

希望这会有所帮助