当前,我有一个正在运行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上的这些文件,则需要使用符号链接。
关于文件上传的文档。 向下滚动一点到"文件上传"。 看看是否有帮助
@kerbholz谢谢,我看了看文档。 据我了解,将内容保存到本地/公共磁盘的唯一方法是使用put,putFile然后是store,但是这些似乎都不起作用。 我猜这不是我的代码有错误,实际上是我没有正确设置的错误。
您还需要确保已在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
希望这可以帮助
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;
}
}
回显$path时,它的确显示为true,但问题是Storage::put()实际上似乎没有执行任何操作。 因为文件实际上没有存储在任何目录中。 这可能仅仅是由于配置问题造成的吗? 它似乎也不在我的本地环境中工作。
为什么您不能使用它:" copy($ image-> getRealPath(),public_path(images /。$ new_file_name));"
都使用copy()或move()都能达到目的,但并没有感觉到它们是保存它的正确方法。 我还希望Laravel处理图像的独特命名,而不是自己完成。 我只是不太确定是什么阻碍了Facades put()功能的正常工作。