laravel在许多输入中上传文件

时间:2017-07-13 08:40:26

标签: laravel laravel-5 laravel-5.2 laravel-5.1 laravel-5.3

我尝试上传4个输入文件中的文件,我从中获取解决方案 here但是最后一个file4输入文件在数据库的所有字段中上传的问题

我的刀片形式

{!! Form::file('file1', null,['class'=>'form-control']) !!}
{!! Form::file('file2', null,['class'=>'form-control']) !!}
{!! Form::file('file3', null,['class'=>'form-control']) !!}
{!! Form::file('file4', null,['class'=>'form-control']) !!}

在我的控制器中

$input = $request->all();
    $files =[];
    if ($request->file('file1')) $files[] = $request->file('file1');
    if ($request->file('file2')) $files[] = $request->file('file2');
    if ($request->file('file3')) $files[] = $request->file('file3');
    if ($request->file('file4')) $files[] = $request->file('file4');
    foreach ($files as $file)
    {
        if(!empty($file)){
            $destinationPath = public_path() . '/uploads';
            $filename = $file->getClientOriginalName();
            $file->move($destinationPath, $filename);
        }

    }
    $model = new Project($input);
    $model -> file1 = $filename;
    $model -> file2 = $filename;
    $model -> file3 = $filename;
    $model -> file4 = $filename;
    $model->save();

2 个答案:

答案 0 :(得分:3)

这是因为您在foreach之外访问$filename,这意味着只使用了最后一个。

您可以执行以下操作:

$input = $request->all();
$model = new Project($input);
$hasFiles = false;

foreach (range(1, 4) as $i) {
    $fileId = 'file' . $i;

    if ($request->hasFile($fileId)) {
        $hasFiles = true;

        $file = $request->file($fileId);

        $destinationPath = public_path() . '/uploads';
        $filename = $file->getClientOriginalName();
        $file->move($destinationPath, $filename);

        $model->$fileId = $filename;
    }
}

if ($hasFiles) {
    $model->save();
}

希望这有帮助!

答案 1 :(得分:0)

如果你想使用这个实现,那么你应该使$filename成为一个数组,因为它将具有最后一个文件的值(当你迭代时)。

if(!empty($file)){
     $destinationPath = public_path() . '/uploads';
     $filename[] = $file->getClientOriginalName();
     $file->move($destinationPath, $filename);
}

然后你可以从那个数组中分配:

$model = new Project($input);
$model -> file1 = isset($filename[0])?$filename[0]:null;
$model -> file2 = isset($filename[1])?$filename[0]:null;
$model -> file3 = isset($filename[2])?$filename[0]:null;
$model -> file4 = isset($filename[3])?$filename[0]:null;
$model->save();

也许可以进行更好的检查,但想法是建立一个包含上传文件名的数组。

<强>思想:

我会为项目制作一个File模型,并在hasManyProject模型中的belongsTo关系中声明File关系。< / p>

这是表示数据的正确方法:

foreach($fileEntityList as $fileEntity){
    $project->files()->attach($fileEntity);
}

查看docs

中的“一对多”