【问题标题】:Multiple upload using Laravel Storage使用 Laravel 存储多次上传
【发布时间】:2017-12-06 13:47:28
【问题描述】:

我尝试使用存储上传多个文件,所以这是我的代码:

public function store(Request $request)
{
    $gallery  = new Gallery();
    $gallery->name = $request->name;
    $gallery->description = $request->description;
    $gallery->save();

    $path = 'public'.'/'.str_slug($request->name);
    Storage::makeDirectory(str_slug($request->name));

    $image = new Image();
    if ( is_array($request->images)) {
        foreach ($request->images as $file) {
            $image->gallery_id = $gallery->id;
            $image->name = $file->getClientOriginalName();
            $image->extension = $file->extension();
            $image->save();
            Storage::putFileAs($path, $file);
        }
    } else {
            $image->gallery_id = $gallery->id;
            $image->name = $request->images->getClientOriginalName();
            $image->save();
    }
}

我已经这样设置了我的表单:

<div class="form-group">
    <label for="images" class="col-md-2 control-label">Images</label>
    <div class="col-md-6">
        <input type="file" class="form-control" name="images[]" id="images[]" multiple>
    </div>
</div>

它给了我这样的错误:

"类型错误:函数 Illuminate\Filesystem\FilesystemAdapter::putFileAs() 的参数太少,2 个传入 E:\laragon\www\blog\vendor\laravel\framework\src\Illuminate\Filesystem\FilesystemManager.php在第 343 行,预计至少有 3 个 ◀"

所以问题是我使用 is_array 检查它是否有多个文件的方式是否正确?第二个什么会导致这个问题?

【问题讨论】:

  • putFileAs 需要 3 个参数,而您传递了 2 个参数,请查看 Documentation
  • @Ying 要将图片上传到公共文件夹还是存储文件夹?请确认,然后我将在下面添加我的答案。
  • 公用文件夹,我尝试输入第三个参数,但似乎我做错了。
  • 如果您使用图像干预来保存图像,为什么要使用存储?你为什么要在foreachreturn back()
  • 大声笑,是的,你说得对,我从单个图像复制粘贴时忘记移动它。

标签: laravel laravel-5 laravel-storage


【解决方案1】:

将第三个参数传递给putFileAs 方法

if( is_array($request->images)){
    foreach ($request->images as $file) {
        $image = new Image();
        $image->gallery_id = $gallery->id;
        $image->name = $file->getClientOriginalName();
        $image->extension = $file->extension();
        $image->size = 555;
        $image->save();

        // Or any custom name as the third argument
        Storage::putFileAs($path, $file, $file->getClientOriginalName());
    }
} else {
        $image = new Image();
        $image->gallery_id = $gallery->id;
        $image->name = $request->images->getClientOriginalName();;
        $image->save();

        // Or any custom name as the third argument
        Storage::putFileAs($path, $request->images, $request->images->getClientOriginalName());
}
return back();

Documentation

【讨论】:

  • 它可以工作,但它只给我数据库中的 1 个文件。
  • @Ying 对不起,我在循环外实例化了图片,请检查更新后的代码
【解决方案2】:

您可以使用以下示例。我认为这将帮助您解决问题

public function store(Request $request)
{
    $gallery  = new Gallery();
    $gallery->name = $request->name;
    $gallery->description = $request->description;
    $gallery->save();

    $path = '/images/'.str_slug($request->name);

    if( is_array($request->images)){
        foreach ($request->images as $file){
            $image = new Image();
            $image->gallery_id = $gallery->id;
            $image->name = $file->getClientOriginalName();
            $image->extension = $file->extension();
            $image->size = 555;
            $image->save();
            $file->move(public_path($path, $image->name);
        }
    }else{
        $image = new Image();
        $image->gallery_id = $gallery->id;
        $image->name = $request->images->getClientOriginalName();;
        $image->save();
        $file->move(public_path($slug, $image->name);
    }
    return back();
}

【讨论】:

  • 你能解释一下使用 Storage 和只使用 move 有什么不同吗?我以为只是移动普通的 php 函数对吗?
  • 您正在使用 Storage 类,这里似乎不需要这个,因为 Laravel 在上传任何图像时都提供了 File 类对象。它还为我们提供了所有文件功能.. 还有一件事,你想上传public 目录而不是storage 目录中的图像。因此,如果您将使用 Storage 类,那么您必须添加额外的代码来移动文件 public 目录。
  • @Ying 还有一件事,如果您将使用Storage::putFileAs($path, $file); ,那么您的文件将移动到您的storage 目录。但是通过使用$file-&gt;move(public_path($path, $image-&gt;name);,您可以将文件上传到publicstorage 等目录中的任何位置。它为我们提供了将文件移动到我们想要上传的位置的灵活性。
  • 是的,你是对的,但我只是确保我可以使用它。因为在此之后我想我会使用其他扩展,比如亚马逊 s3。我想制作一个我认为只能使用存储的私人文件。
  • 如果你想使用 amazon S3 那么你可以使用这个包 league/flysystem-aws-s3-v3 ~1.0 。它将帮助您在 S3 上上传文件。
【解决方案3】:

问题很清楚。当她至少需要 3 个参数时,您正尝试使用 2 个参数调用函数“putFileAs”。
只需查看文档here

所以

【讨论】:

  • 是的,linktoahref 让我清楚如何去做。但现在的问题是它只给我数据库中的 1 个文件。
  • 文档实际上完全没用,因为它只是显示与代码本身完全相同的信息,没有解释 $option 的作用或如何使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2018-12-03
  • 1970-01-01
  • 2015-12-18
  • 2021-11-01
  • 2017-08-29
相关资源
最近更新 更多