我有以下控制器代码,它应该将所有五个图像移动到uploads
目录,但只移动一个图像。
控制器:
if(Input::hasFile('profile_pic')){
$pic = Input::file('profile_pic');
$mobile->photo1 = $pic[0]->getClientOriginalName();
$mobile->photo2 = $pic[1]->getClientOriginalName();
$mobile->photo3 = $pic[2]->getClientOriginalName();
$mobile->photo4 = $pic[3]->getClientOriginalName();
$mobile->photo5 = $pic[4]->getClientOriginalName();
foreach ($pic as $file){
if(!empty($file)){
$file->move(public_path() . '/uploads/', time() . '-' . 'laptop');
}
}
}
图像名称已成功存储在数据库表字段中。但并非所有图像都移动到目标文件夹,只有一个图像移动到文件夹,检查foreach
循环。
这是因为对于所有五个图像,文件名都是相同的。这会执行得如此之快,以至于time()返回相同的值。因此图像会被覆盖。你可以附加一些唯一的字符串,也许像一样
foreach ($pic as $k=>$file){
if(!empty($file)){
$file->move(public_path() . '/uploads/', time() . '-' . $k . '-laptop');
}
}
是的,代码对我来说很好,但你可以在循环中完成,而不是五次获得文件名
$pic = Input::file('profile_pic');
foreach ($pic as $k => $file){
if(!empty($file)){
$mobile->{"photo".$k+1} = $pic[$k]->getClientOriginalName();
$file->move(public_path() . '/uploads/', time() . '-' . $k. '-laptop');
}
}
这样,如果文件不存在,就不会存储文件名。
试试这个代码,你会发现问题:
for ($i = 0; $i<=5; $i++) {
echo time() . PHP_EOL;
}
由于所有这些都发生得非常快,因此用于文件名的time()
返回的值在每次迭代中总是相同的。尝试生成一个伪唯一文件名,例如:
foreach ($pic as $file){
if(!empty($file)){
$file->move(public_path() . '/uploads/', md5(mt_rand(0,time())) . '-' . 'laptop');
}
}