Я использую форму в 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 запомнить выбор файла в качестве старого ввода?
Спасибо!
Нет, вход file
не может быть предварительно заполнен Laravel или любым программным обеспечением. Ваш веб-сайт (и любой веб-сайт) не знает и не должен знать локальный путь к файлу. Представьте себе риски безопасности, если они это сделали! Вы могли бы обмануть пользователя при загрузке личного ключа SSH или чего-то еще.
Что вам нужно сделать, так это обработать загруженный файл, даже если есть ошибки проверки.
Затем вы можете либо сохранить его в своей базе данных с состоянием pending
, либо присвоить ему уникальный hash
, соответствующий hash
, сохраненный в пользовательском сеансе. Дело в том, чтобы иметь возможность идентифицировать неполные загрузки, принадлежащие этому конкретному пользователю.
Затем, когда вы показываете форму, извлекаете эти неполные файлы либо из сеанса, либо из базы данных и показываете миниатюру рядом с загрузкой файла. Это говорит пользователю, что им не нужно повторно загружать этот файл. Просто убедитесь, что у них есть способ удалить его, если они передумали.
Как только форма будет отправлена правильно, очистите сеанс hash
или обновите статус базы данных до complete
; что бы вы ни делали.
Кажется, что существует много вопросов по той же проблеме (Form:: file: как повторно заполнить с помощью Input:: old После ошибок проверки и/или обновления?), и все с очевидными знаниями говорят, что это невозможно.
Я бы предложил обходной путь, который охватывает следующие цели:
Ключевое слово все это AJAX. Я бы сделал следующее:
Обновление за декабрь 2017 года: Отправляйте все поля и прикрепленные файлы с помощью одного AJAX POST
Таким образом, вы избегаете наличия файлов в любом временном состоянии на вашем сервере.
Более сложная, но улучшенная версия этого процесса , если вас беспокоит используемая полоса пропускания, и вы ожидаете, что ошибки в ваших полях ввода будут очень распространены, вы можете сделать два (или более) AJAX Проверка POST: первая с только полями ввода, и если все в порядке, отправьте все поля (поля ввода снова, в том числе вложенные файлы), чтобы повторить проверку и выполнить действия со всеми данными в случае успеха.