¿Forma con enctype = causan problemas “multipart / form-data” que acceden a un campo oculto
-
26-09-2019 - |
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.
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ó.