¿Forma con enctype = causan problemas “multipart / form-data” que acceden a un campo oculto

StackOverflow https://stackoverflow.com/questions/2827778

Pregunta

He creado un elemento de formulario oculto

<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>

Y yo estoy tratando de obtener el valor con esta línea en un servlet (como lo he hecho antes):

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

Pero me sale esto (línea 33 es la línea de arriba):

  

java.lang.NumberFormatException: null
              java.lang.Integer.parseInt (origen desconocido)       java.lang.Integer.parseInt (origen desconocido)       web.objects.UploadImage.doPost (UploadImage.java:33)       javax.servlet.http.HttpServlet.service (HttpServlet.java:637)       javax.servlet.http.HttpServlet.service (HttpServlet.java:717)

¿Hay algo diferente en un formulario con enctype = "multipart / form-data"? O se puede ver algún otro error.

¿Fue útil?

Solución

El servlet analiza los parámetros por defecto utilizando application/x-www-form-urlencoded codificación. La codificación multipart/form-data sin embargo no se admite en servlets hasta Servlet 3.0 . Las llamadas getParameter() hará todo null retorno.

En Servlet 3.0, se debería haber utilizado HttpServletRequest#getParts() en vez de conseguir todas las piezas de una solicitud multipart/form-data, incluyendo campos de formulario normales. Antes de Servlet 3.0, que debería haber utilizado Apache Commons FileUpload a las solicitudes multipart/form-data análisis gramatical. Véase también la siguiente respuesta para un ejemplo detallado de ambos enfoques: Cómo para subir archivos al servidor utilizando JSP / servlet?

Tenga en cuenta que si usted no está utilizando cualquier campo <input type="file"> en absoluto, a continuación, puedes dejar la codificación de distancia del <form>. A continuación, por defecto a application/x-www-form-urlencoded.

Otros consejos

Como solución alternativa, también puede agregar los parámetros ocultos necesarios como parámetros GET en el atributo action del formulario:

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

    //rest of the form here

</form>

esto permitirá que la llamada request.getParameter("imgUploadObjId") de trabajo.

De hecho hay algo diferente.

request.getParameter será sólo el trabajo para los parámetros URL codificados especificados en el atributo de elemento action <form>. En el caso de que no contiene ninguna.

Todos los demás parámetros se incoded en la forma en sí, que hay que proceso mediante el análisis HTTP flujo de entrada de solicitud directamente.

Afortunadamente, usted no es el primero y hay algunas buenas bibliotecas de código abierto que se ocupan de esto.

He estado usando Apache FileUpload . Se crea un programa de análisis y pasa un objeto de la petición a él y luego iterar a través de diferentes artículos. Uno de ellos será su campo oculto.

El multi-parte de codificación no debe afectar a los campos de texto oculto. Es probable que otra cosa. Se puede publicar más de un código HTML / servlet?

No estoy seguro si esto ayuda, pero he utilizado los impresos con copias en páginas JSP que se someten a un servlet puntales y estas páginas han ocultos campos que son recibidos en mis clases de puntales de acción (envueltas en Struts ActionForm), por lo que don' t creo que haya ninguna parada difícil aquí.

¿Usted ha intentado recibir este valor como cadena y ver lo que viene realmente allí?

haría el ingreso del código del servlet en sí. ¿Está recibiendo la solicitud? Se puede depurar la aplicación con el fin de ver qué variables están presentes en el medio ambiente cuando se intenta obtener el valor y analizarlo.

Yo sólo tenía el conjunto atributo id para el campo y que no apareció en la lista de elementos de la lista. Cuando he añadido el atributo de nombre, que se presentó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top