Laravel 5.6 - 无法更改 $request 中上传的文件名,临时名称已插入数据库

Laravel 5.6 - Cannot change the uploaded file name in $request, temporary name is inserted in the database

我用 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 但没有成功。这是$request

dd

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


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

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

查看您提供的输出后,我认为这是您的错误。

$imageName = time().rand(1,100).$image->getClientOriginalName();

您必须像这样添加原始扩展名而不是原始名称,

$imageName = time().rand(1,100).$image->getClientOriginalExtension();

希望你明白。

发生的原因:

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

但是当你使用$request->all()方法时出现问题,见下面Illuminate/Http/Concerns/InteractsWithInput.php

中的all()方法
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() 您的 $request['image'] 必然会被 $request->file('image') 取代。

所以如果你不想像这里一样自动替换它怎么办你想在 $request['file'] 而不是 tmp\php23sf.tmp,

中获取新上传的文件名

解决方案:

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

  1. 您有数据库 table 字段 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);
}

它肯定会起作用,如果我错了请纠正我,或者如果您需要更多信息,请问我任何问题,谢谢。

您必须更改姓名:

<input name="file" type="file"/>

至:

<input name="upload_file" type="file"/>

所述

As you have printed $request array on screen, the uploaded file name has changed as per your desired name,

but problem arises when you use $request->all() method, see below the all() method in Illuminate/Http/Concerns/InteractsWithInput.php

不过,您可以保留输入名称文件并制作

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