Как извлечь текст из форм, помеченных как enctype: multipart / form-data (JSF 2.0) - PullRequest
0 голосов
/ 30 июня 2011

У меня есть страница JSF с формой h :, в которой есть несколько текстовых полей, а также гаджет загрузки изображений из primefaces

Мой вопрос: Как я могу получить текст из полей и назначить их некоторой переменной. (Цель состоит в том, чтобы отделить загруженное изображение (я) от текста)

-Что мне делать?

- Мне нужен фильтр, для этого?

-Есть какой-нибудь простой способ добиться этого с помощью инструмента загрузки файлов primefaces?

1 Ответ

2 голосов
/ 01 июля 2011

Это не тривиально с PrimeFaces 2.2.1.Обработка загрузки файла PF 2 - эпическая ошибка.Под обложками загружать файлы с помощью Ajax уже нетривиально.Объект XMLHttpRequest просто не поддерживает multipart/form-data запросы.Много «Ajaxified» (для ощущения асинхронного прогресса) решения по загрузке файлов основаны на скрытом iframe или - как в случае PF - с использованием Flash.PF 2 основан на Flash, и его нельзя комбинировать с обычным текстовым вводом для отправки всех данных за один раз.

В PF 3 компонент загрузки файлов был значительно переработан .Используя «простой» режим загрузки файлов, ваша проблема должна быть решена.Тем не менее, PF 3 в настоящее время все еще находится в стадии бета / альфа.Вам нужно будет выполнить множество модульных тестов в своем веб-приложении, чтобы убедиться, что оно не сломалось на PF 3.

Если PF 3 не вариант, то лучше всего использовать Tomahawk 2.0 или домашнее пивоКомпонент JSF.


Что касается фильтра, под обложками FacesServlet использует HttpServletRequest#getParameter() для извлечения отправленных значений.Если вы знакомы с базовыми JSP / Servlet , вы должны знать, как это обычно работает.Кодировка HTML-формы по умолчанию - application/x-www-form-urlencoded.Метод getParameter() полагается на это.Тем не менее, чтобы иметь возможность отправлять двоичные данные вместе, например, при загрузке файлов, эта кодировка формы по умолчанию - , неподходящая .Для этого следует использовать multipart/form-data.

Однако, с этой кодировкой формы вызовы getParameter() больше не будут работать.Они все вернутся null.В простейшей форме вам нужно будет проанализировать тело запроса вручную для каждого запроса.См. Также Как загружать файлы на сервер с помощью JSP / Servlet? Однако это не работает в сочетании с JSF, так как он полагается на вызовы getParameter() для установки свойств компонента (значений модели).) с введенными значениями и для вызова действия кнопки / ссылки.

Таким образом, вы хотели бы изменить HttpServletRequest таким образом, чтобы вызовы getParameter() возвращали правильные значения.Для этого Filter является правильным выбором, поскольку он запускает перед любым сервлетом, таким как FacesServlet.Затем фильтр должен проанализировать тело запроса multipart/form-data, создать карту параметров, обернуть и заменить исходную HttpServletRequest пользовательской реализацией, которая возвращает правильные параметры и передает этот объект запроса вместо этого по цепочке, чтобы JSF мог использовать его полностьюпрозрачно "обычным способом".

...