在Laravel中使用foreach上传文件

时间:2019-12-13 12:57:26

标签: laravel

解决此问题已有2天,但仍然无法解决。我正在尝试将多个文件上传到我的Laravel项目中的存储中。我知道我的代码在用dd测试时达到了foreach的要求。

我的控制器:

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

2 个答案:

答案 0 :(得分:3)

我看到您正在尝试将文件直接存储在public文件夹中,但是为什么不使用Laravel的Storage API并使用公用磁盘呢?您可以执行以下操作将文件上传到公共目录:

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

并确保已将存储路径链接到public:

php artisan storage:link

关注$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()
        );
    }
}

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

$files = $request->allFiles();

我希望这会有所帮助。

答案 1 :(得分:1)

您正在尝试遍历文件,而file只是对request-> file()的引用,后者是单个UploadedFile对象。

如您的注释所示,您有多个具有不同名称属性的文件输入,因此,您无法轻松地用一条语句遍历它们,例如:如果您有多个文件都以“ attachments []”的形式上传name属性,您可以使用$request->allFiles('attachments')将其全部获取,但是,如果您想保持输入名称不变,则应该与您想要的名称接近。

public function foo(Request $request, $id){
    $folder = public_path(). "\storage\\$id";

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

    $files = array();
    $files[] = $request->file('current_plan_year_claims_data_file_1');
    $files[] = $request->file('prior_plan_year_claims_data_file_1');
    $files[] = $request->file('etc_file_whatever');

    foreach($files as $file) {
        Storage::disk(['driver' => 'local', 'root' => $folder])->put($file->getClientOriginalName(), file_get_contents($file));
    }
}

请注意,我不确定您对File和public_path的处理方式,但是如果您的目标只是将某些内容放入应用存储中,则类似的操作应该可以

public function foo(Request $request, $id){
    if(!\Storage::exists($id)){
        \Storage::makeDirectory($id);
    }

    $files = array();
    $files[] = $request->file('current_plan_year_claims_data_file_1');
    $files[] = $request->file('prior_plan_year_claims_data_file_1');
    $files[] = $request->file('etc_file_whatever');

    foreach($files as $file) {
        \Storage::put("$id/" . $file->getClientOriginalFileName(), $file);
    }
}