Laravel 5.1: сохранить загруженный файл как старый ввод

9

Я использую форму в Laravel 5.1, чтобы опубликовать текст и загрузить файл. Это выглядит так (упрощенная версия):

{!! Form::open(array('url' => 'foo/bar')) !!}
    {!! Form::text('image_name') !!}
    {!! Form::file('image') !!}
    {!! Form::submit('Submit!') !!}
{!! Form::close() !!}

Текстовое поле требуется, поэтому я добавил $validator в свой контроллер. Если проверка не удалась, пользователь перенаправляется обратно в форму. Я использую метод withInput() для повторного заполнения формы, чтобы пользователь не мог ее снова заполнить:

if ($validator->fails()) {
    return redirect()->back()->withInput();
}

Это приведет к тому, что старый вход будет возвращен для текстовых полей, выпадающих меню и т.д. Но если пользователь загрузил файл, выбор файла исчезнет, ​​когда проверка не удалась, и его нужно снова выбрать. Есть ли способ в Laravel запомнить выбор файла в качестве старого ввода?

Спасибо!

  • 1
    Я не думаю, что вы можете - не только в Laravel, но и вообще - по соображениям безопасности / сложности.
Теги:
laravel-5

2 ответа

17
Лучший ответ

Нет, вход file не может быть предварительно заполнен Laravel или любым программным обеспечением. Ваш веб-сайт (и любой веб-сайт) не знает и не должен знать локальный путь к файлу. Представьте себе риски безопасности, если они это сделали! Вы могли бы обмануть пользователя при загрузке личного ключа SSH или чего-то еще.

Что вам нужно сделать, так это обработать загруженный файл, даже если есть ошибки проверки.

Затем вы можете либо сохранить его в своей базе данных с состоянием pending, либо присвоить ему уникальный hash, соответствующий hash, сохраненный в пользовательском сеансе. Дело в том, чтобы иметь возможность идентифицировать неполные загрузки, принадлежащие этому конкретному пользователю.

Затем, когда вы показываете форму, извлекаете эти неполные файлы либо из сеанса, либо из базы данных и показываете миниатюру рядом с загрузкой файла. Это говорит пользователю, что им не нужно повторно загружать этот файл. Просто убедитесь, что у них есть способ удалить его, если они передумали.

Как только форма будет отправлена ​​правильно, очистите сеанс hash или обновите статус базы данных до complete; что бы вы ни делали.

  • 0
    Спасибо за этот четкий ответ; это имеет большой смысл. Я рассмотрю логику, необходимую для обработки загруженного файла независимо.
2

Кажется, что существует много вопросов по той же проблеме (Form:: file: как повторно заполнить с помощью Input:: old После ошибок проверки и/или обновления?), и все с очевидными знаниями говорят, что это невозможно.

Я бы предложил обходной путь, который охватывает следующие цели:

  • Сохранять данные формы и файл в случае неудачной проверки Laravel
  • Использовать только проверку на стороне сервера. Вам не нужно ДОЛЖНО ИСПОЛЬЗОВАТЬ проверку javascript.

Ключевое слово все это AJAX. Я бы сделал следующее:

Обновление за декабрь 2017 года: Отправляйте все поля и прикрепленные файлы с помощью одного AJAX POST

  • Создайте форму AJAX (метод GET POST), содержащий все , кроме , включая входной файл. Помните, что для этого требуется отправить маркер Laravel CSRF.
  • В проверке контроллера вам нужно сделать свои ответы (неудачные или успешные), чтобы сделать вывод JSON, поэтому ваш код отправки AJAX может получить ответ в любом случае, а затем вы можете показать его в своем браузере.

Таким образом, вы избегаете наличия файлов в любом временном состоянии на вашем сервере.

Более сложная, но улучшенная версия этого процесса , если вас беспокоит используемая полоса пропускания, и вы ожидаете, что ошибки в ваших полях ввода будут очень распространены, вы можете сделать два (или более) AJAX Проверка POST: первая с только полями ввода, и если все в порядке, отправьте все поля (поля ввода снова, в том числе вложенные файлы), чтобы повторить проверку и выполнить действия со всеми данными в случае успеха.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню