首页 > 解决方案 > Laravel 5.6 - 无法更改 $request 中上传的文件名,临时名称插入数据库

问题描述

我创建了一个表单file并上传了文件并将数据很好地存储在数据库中。问题是,我需要将修改后的文件名存储在数据库中,但 Laravel 将临时名称存储在数据库中。这是代码

public function store(Request $request)
{
    $image = $request->file('file');
    $imageName = time().rand(1,100).$image->getClientOriginalName();
    $image->move(public_path('uploads'),$imageName);
    $request['file'] = $imageName;
    //$request->file = $imageName;
    $im = new Image($request->all());
    $this->user->images()->save($im);
}

我试图file手动修改,但没有奏效。这dd$request

在此处输入图像描述

但是临时文件名仍然插入到数据库中。


这是表和file列必须有文件名

在此处输入图像描述

如您所见,我提供的文件名不在file列中,临时文件在其中

标签: laravellaravel-5laravel-request

解决方案


发生的原因:

当您在屏幕上打印$request数组时,上传的文件名已根据您想要的名称更改,

但是使用方法时会出现问题$request->all(),请参见下面的Illuminate/Http/Concerns/InteractsWithInput.phpall()中的方法

public function all($keys = null)
    {
        $input = array_replace_recursive($this->input(), $this->allFiles());

        if (! $keys) {
            return $input;
        }

        $results = [];

        foreach (is_array($keys) ? $keys : func_get_args() as $key) {
            Arr::set($results, $key, Arr::get($input, $key));
        }

        return $results;
    }

如果两者具有相同的名称,则上述方法将普通输入键替换为文件输入键,这意味着如果您有$request['image']然后$request->file('image')在调用$request->all()your之后$request['image']必然会替换为$request->file('image').

那么如果你不想像这里那样自动替换它你想获取新上传的文件名$request['file']而不是 tmp\php23sf.tmp 怎么办,

解决方案:

一种解决方法是在文件输入和数据库字段名称中使用不同的名称,让我们举个例子:

  1. file您有用于存储上传文件名的数据库表字段,因此userfile在文件输入中使用名称或任何其他名称作为<input type="file" name="userfile">
  2. 然后在您的控制器中使用与您使用不同名称相同的代码:

见下文:

public function store(Request $request)
{
    $image = $request->file('userfile');
    $imageName = time().rand(1,100).$image->getClientOriginalName();
    $image->move(public_path('uploads'),$imageName);
    $request['file'] = $imageName;
    $im = new Image($request->all());
    $this->user->images()->save($im);
}

它肯定会起作用,如果我错了,请纠正我,或者如果您想了解更多信息,请咨询我,谢谢。


推荐阅读