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
столбец, временный там
5 ответов
Попробуй это:
$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
]);
Причина, почему это произошло:
Как вы напечатали $request
массив на экране, имя загруженного файла изменилось в соответствии с желаемым именем,
но проблема возникает при использовании $request->all()
метод, см. ниже all()
метод в Освещение / Http / Concerns / InteractsWithInput.php
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,
Решение:
один из обходных путей - использовать разные имена при вводе файла и имя поля базы данных, давайте рассмотрим ваш пример:
- У вас есть поле таблицы базы данных
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"/>
как описал @Haritsinh Gohil
Поскольку вы напечатали массив $request на экране, имя загруженного файла изменилось в соответствии с вашим желаемым именем,
но проблема возникает, когда вы используете метод $request->all(), см. ниже метод all() в 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)
Посмотрев на предоставленный вами вывод, я думаю, что здесь ваша ошибка.
$imageName = time().rand(1,100).$image->getClientOriginalName();
Вы должны добавить оригинальное расширение вместо оригинального имени, как это,
$imageName = time().rand(1,100).$image->getClientOriginalExtension();
Я надеюсь, вы понимаете.