Laravel 5.6-无法在$ request中更改上载的文件名,数据库中插入了临时名

时间:2018-08-28 05:47:55

标签: laravel laravel-5 laravel-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的{​​{1}}

enter image description here

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


这是表,$request列必须具有文件名

enter image description here

您看到我提供的文件名不在file列中,临时文件位于其中

5 个答案:

答案 0 :(得分:1)

尝试一下:

$im = new Image([
   'title' => $request->get('title'),
   'type' => $request->get('type'),
   'photographer' => $request->get('photographer'),
   'year' => $request->get('year'),
   'detail' => $request->get('detail'),
   'file' => $imageName
]);

答案 1 :(得分:1)

原因为何发生:

在屏幕上打印$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'),则在调用{{1}之后}您的$request->all()必将替换为$request['image']

所以,如果您不想像此处那样自动替换它,该怎么办,您想在$request->file('image')中而不是tmp \ php23sf.tmp中获取新上传的文件名,

解决方案:

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

  1. 您具有数据库表字段$request['file']用于存储上传的文件名,因此在文件输入中使用名称file或其他任何名称作为userfile
  2. 然后在控制器中使用与使用不同名称的相同代码:

请参见下文

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

绝对可以,如果我错了,请纠正我,或者如果需要进一步的信息,请问我。

答案 2 :(得分:1)

您必须将名称更改为:

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

收件人:

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

答案 3 :(得分:0)

@Haritsinh Gohil所述

<块引用>

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

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

但是,您可以使用名称文件保留输入并制作

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

答案 4 :(得分:-1)

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

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

您必须添加“原始扩展名”而不是“原始名称”,

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

希望您能理解