Вызывает ли форма с enctype = "multipart / form-data" проблемы с доступом к скрытому полю - PullRequest
5 голосов
/ 13 мая 2010

Я создал скрытый элемент формы

<form name="UploadImage" enctype="multipart/form-data" method="post" action="UploadImage">
    <label>
        </label>
    <input name="imgUploadObjId" id="imgUploadObjId" value="52" type="hidden">

    //rest of the form here

</form>

И я пытаюсь получить значение с помощью этой строки в сервлете (как я делал ранее):

int objId = Integer.parseInt(request.getParameter("imgUploadObjId"));

Но я получаю это (строка 33 - строка выше):

java.lang.NumberFormatException: null
java.lang.Integer.parseInt (неизвестный источник) java.lang.Integer.parseInt (неизвестный источник) web.objects.UploadImage.doPost (UploadImage.java:33) javax.servlet.http.HttpServlet.service (HttpServlet.java:637) javax.servlet.http.HttpServlet.service (HttpServlet.java:717)

Есть ли что-то другое в форме с enctype = "multipart / form-data"? Или вы можете увидеть какую-то другую ошибку.

Ответы [ 7 ]

15 голосов
/ 13 мая 2010

Сервлет анализирует параметры по умолчанию с использованием кодировки application/x-www-form-urlencoded. Однако кодировка multipart/form-data в сервлетах не поддерживается до Servlet 3.0 . Все вызовы getParameter() вернут null.

В Servlet 3.0 вы должны были использовать HttpServletRequest#getParts() вместо того, чтобы получить все части запроса multipart/form-data, включая обычные поля формы. До Servlet 3.0 вы должны были использовать Apache Commons FileUpload для анализа multipart/form-data запросов. См. Также следующий ответ для подробного примера обоих подходов: Как загрузить файлы на сервер, используя JSP / Servlet?

Обратите внимание: если вы вообще не используете поле <input type="file">, вы можете просто оставить кодировку вне <form>. Затем по умолчанию будет application/x-www-form-urlencoded.

3 голосов
/ 17 января 2012

В качестве обходного пути вы также можете добавить необходимые скрытые параметры в качестве параметров GET в атрибуте действия формы:

<form name="UploadImage" enctype="multipart/form-data" method="post" action="UploadImage?imgUploadObjId=52">

    //rest of the form here

</form>

это позволит request.getParameter("imgUploadObjId") вызову работать.

2 голосов
/ 13 мая 2010

Действительно есть что-то другое.

request.getParameter будет работать только для жестко закодированных параметров URL-адреса, указанных в атрибуте action элемента <form>. В вашем случае он не содержит.

Все остальные параметры будут включены в саму форму, которую вы должны обработать, анализируя входной поток HTTP-запроса напрямую.

К счастью, вы не первый, и есть несколько хороших библиотек с открытым исходным кодом, которые позаботятся об этом.

Я использовал Apache FileUpload . Вы создаете парсер и передаете ему объект запроса, а затем перебираете различные элементы. Одним из них будет ваше скрытое поле.

1 голос
/ 13 мая 2010

Вы бы проверили сам код сервлета. Вы получаете запрос? Можете ли вы отладить приложение, чтобы увидеть, какие переменные присутствуют в среде, при попытке получить значение и проанализировать его.

1 голос
/ 13 мая 2010

Не уверен, поможет ли это, но я использовал многокомпонентные формы на страницах jsp, которые передаются сервлету Struts, и на этих страницах есть скрытые поля, полученные в моих классах Struts Action (обернутые в Struts ActionForm), поэтому Не думаю, что здесь есть какая-то жесткая остановка.

Вы пытались получить это значение в виде строки и посмотреть, что на самом деле там происходит?

1 голос
/ 13 мая 2010

Кодировка из нескольких частей не должна влиять на скрытые текстовые поля. Вероятно, что-то еще. Можете ли вы опубликовать больше кода HTML / сервлета?

0 голосов
/ 29 июля 2014

У меня был установлен только атрибут id для поля, и он не отображался в списке элементов списка. Когда я добавил атрибут name, он обнаружился.

...