Laravel 5.1多图移动(move)问题

3
我可以为您进行翻译。这是一个控制器的代码,它应该将五张图片都移动到 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循环。

2个回答

1
这是因为对于这五张图片,文件名相同,时间戳函数(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');

   }
}

这样,如果文件不存在,您就不会存储文件名。

是的,我觉得它看起来很不错,但请阅读上面的建议 :) - Milan Maharjan
兄弟,上述代码甚至没有上传一张图片!错误提示为: “由于未知错误,文件“13-512.png”未被上传。” - user5594652
哦,我忘记在文件名中加上 $k 了。 - Milan Maharjan
我已经编辑了这篇文章,请试一下。但是你明白这里的概念,循环并获取原始文件名,对吧?可能会有一些错误,请尝试修复它们。 - Milan Maharjan

0

试着运行这段代码,你就会看到问题所在:

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');
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接