Отклонить форму без перегрузки страницы в Play 2.0.3
-
11-12-2019 - |
Вопрос
в Play Framework, возможно ли отклонить поле
filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));
.
без перезагрузки страницы?
У меня есть поле ввода файла, которое позволяет пользователям выбирать файлы.На отклонении и перезагрузке файлы очищены, и отображается ошибка.Я хочу, чтобы файлы, которые они выбрали, чтобы быть там
Текущее поведение: Перед отправкой формы:
После отправки (с ошибкой: файлы ушли)
Решение
Файл Выбрать поля ввода (I.E. <input type="file" ... />
) отличаются от других полей ввода - вы не можете предварительно заполнить значение на стороне сервера. Это было бы массивной безопасности, если вы могли бы (подумать о <input type="file" value="/etc/passwd" .. />
). На сервере, когда вы получаете представленную форму, вы не получаете полный путь к файлу, которое было загружено, просто имя файла и содержимого.
Если вам действительно нужно сохранить значение поля ввода файла, вам нужно будет пойти по другому маршруту: отправьте форму через ajax (Google для файла Ajax для некоторых методов и библиотек, чтобы помочь с этим), и используйте ответ AJAX, чтобы указать, был ли файл действителен или нет.
Дальнейшее разъяснение: с нормальным методом HTML / HTTP Post (который использует Play Forms Hempers), исходная страница отсутствует, а ответ сервера - это новая страница без подключения к предыдущей странице. Помогитеры Play Forms будут предварительно заполнить поля ввода на этой странице с предыдущими значениями, но, как описано выше, это невозможно для поля ввода файла.
Вот почему есть специальные библиотеки JavaScript для загрузки файлов. Если ваша форма в первую очередь связана с выполнением загрузки файлов, вы должны посмотреть на них. (E.g. http://fineuploader.com ). На стороне сервера цель запроса AJAX будет новым действием, которое просто обрабатывает загруженные файлы и возвращает сообщение об успехе / отказом, которое вы затем отображаете пользователю.
Другие советы
Если сервер сможет управлять значением файлового поля, это было бы основным риском безопасности, поскольку мы могли бы взять любой файл с пользовательского жесткого диска.Если мы посмотрим на два требования, которые у вас есть,
- .
- Получить содержимое файла на сервере
- не беспокоить клиента UI состояния
Единственный вариант - использовать файл AJAX.Таким образом, ваш поток сейчас становится:
- .
- Отправить файл через ajax Загрузить
- подтвердить содержимое
- Сохранить файл для последующего поиска
- Отправьте статус (OK или ошибка)
- Показать ошибку по ошибке
- После того, как вся форма представлена, посмотрите ранее сохраненный файл
Вы, вероятно, можете немного изменять, если вы не против нагрузки - просто сделайте проверку с AJAX, чтобы отобразить сообщение об ошибке, и пусть файл снова будет загружено на нормальном представлении.
Это все о работе с ограничениями, которые у нас есть.