在 Laravel 中使用 foreach 上传文件

Ale*_*der 6 laravel

已经在这个问题上工作了 2 天,但仍然无法弄清楚。我正在尝试将多个文件上传到我的 Laravel 项目中的存储中。我知道我的代码适用于 foreach,因为我用 dd 对此进行了测试。

我的控制器:

$files = $request->file('current_plan_year_claims_data_file_1');
$folder = public_path(). "\storage\\$id";

if (!File::exists($folder)) {
    File::makeDirectory($folder, 0775, true, true);
}

if (!empty($files)) {
    foreach($files as $file) {
        Storage::disk(['driver' => 'local', 'root' => $folder])->put($file->getClientOriginalName(), file_get_contents($file));
    }
}
Run Code Online (Sandbox Code Playgroud)

Reh*_*mat 5

我看你是想直接把文件存到文件public夹里,为什么不用StorageLaravel的API,用公盘呢?您可以执行以下操作将文件上传到公共目录:

$id = 123;
$files = $request->file();
$folder = $id;
if (count($files) > 0) {
    foreach ($files as $file) {
        $file->store($folder, ['disk' => 'public']);
    }
}
Run Code Online (Sandbox Code Playgroud)

并确保您已将存储路径链接到公共:

php artisan storage:link
Run Code Online (Sandbox Code Playgroud)

专注于$files = $request->file();线。当您不向file()方法传递参数时,将返回所有上传的文件实例。现在,当您遍历$files数组时,您将可以访问各个上传的文件。

然后您可以使用您的逻辑存储文件,即您可以使用原始名称或其他任何名称。甚至您可以使用Storage外观来处理文件实例。

即如果你想用它们的原始名称存储文件,我发现这是一种更清晰的方式,而不是你在做什么:

$id = 123;
$files = $request->file();
$folder = $id;
if (count($files) > 0) {
    foreach ($files as $file) {
        Storage::disk('public')->putFileAs(
            $folder,
            $file,
            $file->getClientOriginalName()
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

正如@cbaconnier 所建议的,您也可以使用allFiles()更具描述性的方法:

$files = $request->allFiles();
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。

  • 旁注:您还可以使用`->allFiles()`,这样更容易混淆 (2认同)