Я использую форму в 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 After Validation Errors and / or on Update? ), И все с очевидными знаниями говорят, что это невозможно.
Я бы предложил обходное решение, которое охватывает следующие цели:
Ключевое слово все это AJAX . Я бы сделал следующее:
Обновление в декабре 2017 года: отправьте все поля и вложенные файлы с помощью одной AJAX POST
Таким образом, вы избегаете наличия файлов в любом временном состоянии на вашем сервере.
Более сложная, но улучшенная версия этого процесса, если вас беспокоит используемая полоса пропускания, и вы ожидаете, что ошибки в ваших полях ввода будут очень распространены, вы можете выполнить две (или более) проверки AJAX POST: первая с полями ввода только, и если все в порядке, отправьте все поля (поля ввода снова, в том числе вложенные файлы), чтобы повторить проверку и выполнить действия со всеми данными в случае успеха.