【问题标题】:laravel upload files in many inputslaravel 在许多输入中上传文件
【发布时间】:2018-04-26 22:51:02
【问题描述】:

我正在尝试上传 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();

【问题讨论】:

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


    【解决方案1】:

    这是因为您在 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();
    }
    

    希望这会有所帮助!

    【讨论】:

    • 您是否尝试过调试问题?有错误吗?文件是否肯定被提交到服务器?您是否更改了文件输入的名称? $request->hasFile($fileId) 是否返回 true? $hasFilesforeach 之后是真的吗?文件是否正在上传到文件系统?
    【解决方案2】:

    如果您想使用此实现,那么您应该将 $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 模型,并在Project 中声明一个hasMany 关系,在File 模型中声明一个belongsTo 关系。

    这将是表示数据的正确方式:

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

    查看docs中的“一对多”

    【讨论】:

    • 我得到错误 strrpos() 期望参数 1 是字符串,添加 $filename[] 时给出的数组
    • 添加 $filename[] 时会发生这种情况
    • 你知道问题出在哪里
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2016-11-28
    • 2020-04-22
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多