Laravel 5.1多图像移动()问题


Laravel 5.1 multiple images move() issue

我有以下控制器代码,它应该将所有五个图像移动到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');
   }
}