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,
中获取新上传的文件名
解决方案:
一种解决方法是在文件输入和数据库字段名称中使用不同的名称,让我们举个例子:
- 您有数据库 table 字段
file
用于存储上传的文件名,因此在文件输入中使用名称 userfile
或任何其他名称作为 <input type="file" name="userfile">
- 然后在你的控制器中使用与你使用的不同名称相同的代码:
见下文:
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)
我用 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,
解决方案:
一种解决方法是在文件输入和数据库字段名称中使用不同的名称,让我们举个例子:
- 您有数据库 table 字段
file
用于存储上传的文件名,因此在文件输入中使用名称userfile
或任何其他名称作为<input type="file" name="userfile">
- 然后在你的控制器中使用与你使用的不同名称相同的代码:
见下文:
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)