【问题标题】:laravel tries to store multiple images but only store of them multiple timeslaravel 尝试存储多个图像,但只存储它们多次
【发布时间】:2020-10-13 07:58:49
【问题描述】:

我已经将多个不同的(已经检查过的)图像发送到服务器,在 laravel 控制器中我有这个:

//...

if ($request->has('images')) {
    $images = [];
    foreach ($request->file('images') as $image){
        $img = new \App\Image;
        $name = Str::slug($validated['name']).'_'.time().'.'.$image->getClientOriginalExtension();
        $folder = '/uploads/images/authors/';
        $image->storeAs($folder, $name, 'public');
        $img->url = $folder.$name;
        array_push($images,$img);
    }

    $author->images()->saveMany($images);
}

//...

然后我查看存储中的目标路径,发现其中一张图像以不同的名称重复多次。

那么问题出在哪里?

【问题讨论】:

  • 我想如果你改变这条线,它也会起作用$img = $folder.$name;
  • @sta 但$img 是他们的模型实例,saveMany 接受模型实例
  • 我有点惊讶你没有比预期更少的图像,因为 time() 可能会返回相同的结果,具体取决于循环迭代的速度
  • @lagbox 存储的图片名称不同但内容相同。所以我认为 time() 不是问题。
  • 可能是因为循环中的每个文件的文件名可能相同,这意味着只有 1 个文件(最后一个)......每次运行时都会有又添加了 1 个文件(循环中的最后一个),如果每次运行时都使用相同的确切数据,那么所有文件最终都会是相同的内容,因为文件名在循环中没有改变(如果这花了不到一秒钟的时间)因为time() 是基于秒

标签: laravel


【解决方案1】:

使您的文件名目的地独一无二。

if ($request->has('images')) {
    $images = [];
    foreach ($request->file('images') as $image){
        $img = new \App\Image;
        $name = Str::random(8).'_'.Str::slug($image->getClientOriginalName()).'.'.$image->getClientOriginalExtension();

        // Debug:
        logger('Received a file named '.$image->getClientOriginalName().' storing as '.$name);

        $folder = '/uploads/images/authors/';
        $image->storeAs($folder, $name, 'public');
        $img->url = $folder.$name;
        $images[] = $img;
    }

    $author->images()->saveMany($images);
}

【讨论】:

  • 我将Str::random() 添加到$name 并且代码有效。谢谢,但我不知道为什么。
  • @Reundo 你的 $validated['name'] 每次都是一样的。您可以直接传递文件名,laravel 会确保它是一个有效且可接受的文件名
  • $validated['name'] 不是问题所在。我知道 laravel 会这样做,但我编辑了一些属性并且也想要原始请求。
猜你喜欢
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多