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,

Решение:

один из обходных путей - использовать разные имена при вводе файла и имя поля базы данных, давайте рассмотрим ваш пример:

  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);
}

Это сработает определенно, поправьте меня, если я ошибаюсь, или спросите меня, если вам нужна дополнительная информация, спасибо.

Вам необходимо изменить имя с:

<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();

Я надеюсь, вы понимаете.

Другие вопросы по тегам