我正在一个项目中,用户必须将几个图像(通过单个表单字段)上传到服务器。使用foreach
,我使用ftp存储图像。这是我的代码:
use Storage;
$image_list = $request->file('images');
foreach($image_list as $image){
$filename = Cuid::slug().'.'.$image->getClientOriginalExtension();
$path = "images/templates/";
Storage::disk('ftp')->put($path.$filename, 'Contents');
}
该代码实际上可以正常工作,但是我担心直接使用Storage Facade可以像这样为每个循环创建多个实例,并且它不再是优化的代码。我试图像这样为存储外观创建对象:
$storage = new Storage;
foreach($image_list as $image){
...
$storage->disk('ftp')->put($path.$filename, 'Contents');
}
但这给了我一个错误:
调用未定义的方法Illuminate \ Support \ Facades \ Storage :: disk()
有没有办法在每次循环运行时不直接调用Storage Facade? p>
答案 0 :(得分:2)
这段代码实际上可以正常工作,但是我担心直接使用Storage Facade这样会为每个循环创建多个实例,并且它不再是优化代码了。
根据我的理解,您担心所编写的代码没有得到优化,因为您直接使用了Facades。
Facades不一定每次使用Facade时都会创建新对象,而是从容器中解析出来(将其视为黑盒,它将满足您的要求),有时会创建一个新对象,但是通常,它仍然会为您提供已经存在的对象。
如果您想知道这是如何工作的,请执行以下操作:Google用于单例和备忘录。
因此,在这种情况下,您可以使用相同的代码而不必担心。和您尝试提出的代码仍然相同。但是,我敢肯定,您会遇到性能问题,但是现在不是。
我现在想到的一件事是修改您的代码,使您可以尝试一次保存/放置许多文件,而不是一次通过FTP发送一个文件?还是可以使用a queue?