Foros del Web » Programación para mayores de 30 ;) » Java »

Error con input "text","file" y servlets multipart form-data

Estas en el tema de Error con input "text","file" y servlets multipart form-data en el foro de Java en Foros del Web. Tengo un formulario: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original < html > < head > < title > subir archvio < / title > < ...
  #1 (permalink)  
Antiguo 05/10/2011, 15:25
Avatar de jrevilla  
Fecha de Ingreso: septiembre-2011
Ubicación: Lima, Peru, Peru
Mensajes: 51
Antigüedad: 12 años, 7 meses
Puntos: 2
Información Error con input "text","file" y servlets multipart form-data

Tengo un formulario:

Código HTML:
Ver original
  1. <title>subir archvio</title>
  2. </head>
  3. <form action="<%=request.getContextPath()%>/ServletSubir"
  4. method="post" name="imagen"  enctype="multipart/form-data">
  5. <table cellpadding="3.0">
  6.     <tr>
  7.     <td>Buscar Imagen:</td>
  8.     <td><input type="file" name="imagen" ></td>
  9.  
  10.     </tr>
  11.     <tr>
  12.         <td>DNI:</td>
  13.         <td><input type="text" name="txtDni"></td>
  14.     </tr>
  15.     <tr>
  16.         <td>Nombres:</td>
  17.         <td><input type="text" name="txtNombres"></td>
  18.     </tr>
  19.     <tr>
  20.         <td>Apellidos:</td>
  21.         <td><input type="text" name="txtApellidos"></td>
  22.     </tr>
  23.     <tr>
  24.         <td>Dirección:</td>
  25.         <td><input type="text" name="txtDireccion"></td>
  26.     </tr>
  27.     <tr>
  28.         <td>Telefono:</td>
  29.         <td><input type="text" name="txtTelefono"></td>
  30.     </tr>
  31.     <tr>
  32.         <td><input type="reset" value="Limpiar" ></td>
  33.         <td><input type="submit" value="Enviar Formulario"> </td>
  34.     </tr>
  35. </form>
  36. </body>
  37. </html>

En el cual deseo enviar un archivo y otros datos, lo que me da un error . La solución sería tener un formulario distinto para el archivo y poner el enctype='multipart/form-data' y otro para el resto de los dato sin el enctype='multipart/form-data'.

Estoy usando un servlet que recibe los datos del formulario, por si les ayuda aqui va mi servlet:
Código Javascript:
Ver original
  1. package servlet;
  2.  
  3. import dean.*;
  4.  
  5. import java.io.IOException;
  6.  
  7. import javax.servlet.RequestDispatcher;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.annotation.WebServlet;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13.  
  14.  
  15. @WebServlet("/ServletSubir")
  16. public class ServletSubir extends HttpServlet {
  17.     private static final long serialVersionUID = 1L;
  18.    
  19.  
  20.    
  21.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  22.         // TODO Auto-generated method stub
  23.     }
  24.  
  25.    
  26.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27.        
  28.         String imagen = request.getParameter("imagen");
  29.         String dni = request.getParameter("txtDni");
  30.         String nombres = request.getParameter("txtNombres");
  31.         String apellidos = request.getParameter("txtApellidos");
  32.         String direccion = request.getParameter("txtDireccion");
  33.         String telefono = request.getParameter("txtTelefono");
  34.        
  35.         System.out.println("imagen ruta> "  + imagen);
  36.         RequestDispatcher dispatcher = null;
  37.        
  38.         Subir bean = new Subir();
  39.         bean.setDni(dni);
  40.         bean.setNombres(nombres);
  41.         bean.setApellidos(apellidos);
  42.         bean.setDireccion(direccion);
  43.         bean.setTelefono(telefono);
  44.        
  45.         request.setAttribute("imagen", imagen);
  46.         request.setAttribute("dni", dni);
  47.         request.setAttribute("nombres", nombres);
  48.         request.setAttribute("apellidos", apellidos);
  49.         request.setAttribute("direccion", direccion);
  50.         request.setAttribute("telefono", telefono);
  51.        
  52.         dispatcher = getServletContext().getRequestDispatcher("/mensaje.jsp");
  53.         dispatcher.forward(request, response);
  54.        
  55.        
  56.        
  57.     }
  58.  
  59. }

Se puede tener todo en un formulario (archivos y texto, area, etc), y si se puede, que enctype poner????

por ahora solo quiero enviarloa una pagina llamada mensaje:

Código Javascript:
Ver original
  1. <html>
  2. <head>
  3. <title>Mensaje</title>
  4. </head>
  5. <body>
  6. <table>
  7.     <tr>
  8.         <td>Imagen:</td>
  9.         <td><img src="<%=request.getAttribute("imagen")%>"/></td>
  10.     </tr>
  11.     <tr>
  12.         <td>DNI:</td>
  13.         <td><%=request.getAttribute("dni")%></td>
  14.     </tr>
  15.     <tr>
  16.         <td>Nombres:</td>
  17.         <td><%=request.getAttribute("nombres")%></td>
  18.     </tr>
  19.     <tr>
  20.         <td>Apellidos:</td>
  21.         <td><%=request.getAttribute("apellidos")%></td>
  22.     </tr>
  23.     <tr>
  24.         <td>Direccion:</td>
  25.         <td><%=request.getAttribute("direccion")%></td>
  26.     </tr>
  27.     <tr>
  28.         <td>Telefono:</td>
  29.         <td><%=request.getAttribute("telefono")%></td>
  30.     </tr>
  31.  
  32. </table>
  33. </body>
  34. </html>

Lo que molesta es que cuando esta con "multipart/form-data" todos mis campos en mensaje.jsp salen como NULL

Si alguien puede explicarme que debo hacer, o solo un ejemplo pequeño, se que me ayudaria bastante

Gracias
  #2 (permalink)  
Antiguo 05/10/2011, 17:08
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Error con input "text","file" y servlets multipart form-data

Hola:

Evidentemente tu problema no es de javascript sino de java, así que movemos el tema... aprovecho para comentarte que con ese enctype se envían ficheros y datos sin problemas... pero mejor que vea el tema alguien que sepa más que yo en este lenguaje.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 06/10/2011, 01:32
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Error con input "text","file" y servlets multipart form-data

¿Qué servidor usas?
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #4 (permalink)  
Antiguo 06/10/2011, 02:22
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Error con input "text","file" y servlets multipart form-data

Has de entender que con ese enctype no vale el servlet normal para recuperar los valores.

Necesitas importar una clase como esta: http://www.servlets.com/cos/javadoc/...rtRequest.html

Y luego en vez de

String nombres = request.getParameter("txtNombres");

Primero habría que hacer

MultipartRequest mr = new MultipartRequest(request);
String [] nombres = mr.getParameterValues("txtNombres");
String nombres = nombres[0];

... para el archivo te revisas la información del javadoc que te he pasado y miras como recuperarlo ^^
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 06/10/2011, 13:03
Avatar de jrevilla  
Fecha de Ingreso: septiembre-2011
Ubicación: Lima, Peru, Peru
Mensajes: 51
Antigüedad: 12 años, 7 meses
Puntos: 2
Respuesta: Error con input "text","file" y servlets multipart form-data

Cita:
Iniciado por Xerelo Ver Mensaje
¿Qué servidor usas?
uso el tomcat


Cita:
Iniciado por Fuzzylog Ver Mensaje
Has de entender que con ese enctype no vale el servlet normal para recuperar los valores.

Necesitas importar una clase como esta: [url]http://www.servlets.com/cos/javadoc/com/oreilly/servlet/MultipartRequest.html[/url]

Y luego en vez de

String nombres = request.getParameter("txtNombres");

Primero habría que hacer

MultipartRequest mr = new MultipartRequest(request);
String [] nombres = mr.getParameterValues("txtNombres");
String nombres = nombres[0];

... para el archivo te revisas la información del javadoc que te he pasado y miras como recuperarlo ^^
gracias voy a rebisarlo, pero si necesito un poco mas de ayuda, cuento contigo?? =)
  #6 (permalink)  
Antiguo 07/10/2011, 04:46
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Error con input "text","file" y servlets multipart form-data

Fíjate que mi constructor es diferente al de los disponibles para esa clase (en los constructores que vienen se puede incluir la ruta donde se van a guardar los archivos y el tamaño máximo de los mismos ** en Bytes supongo, entre otros atributos)

Además en vez de mr.getParameterValues(nombreParametro) puedes hacer mr.getParameter(nombreParametro) y meterlo directamente a la variable.

El método para recoger el archivo que se va a subir es getFile(nombreInput);

Espero que con esta guía te sea suficiente para ver como trabajar con la clase.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #7 (permalink)  
Antiguo 07/10/2011, 14:34
Avatar de jrevilla  
Fecha de Ingreso: septiembre-2011
Ubicación: Lima, Peru, Peru
Mensajes: 51
Antigüedad: 12 años, 7 meses
Puntos: 2
De acuerdo Respuesta: Error con input "text","file" y servlets multipart form-data

Gracias Fuzzylog , despues de 1 desvelada total revisando como 20 tutoriales y foros , al fin pude encontrerle solucion!! =) ... lo voy a colocar aqui por que he visto q yo no soy el unico que sufrio con esto, lo podre para la posteridad jejeje ......


INDEX.JSP
Código HTML:
Ver original
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  2.    pageEncoding="ISO-8859-1"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <title>xD</title></HEAD>
  5. <center>
  6. <form method="POST" enctype='multipart/form-data' action="<%=request.getContextPath()%>/ServletSubir">
  7. <table border="2.0" cellpadding="2.0">
  8.     <tr>
  9.         <td>Nombres: </td>
  10.         <td><input type="text" name="txtNombres" /></td>
  11.     </tr>
  12.     <tr>
  13.         <td>Apellidos: </td>
  14.         <td><input type="text" name="txtApellidos" /></td>
  15.     </tr>
  16.     <tr>
  17.         <td>Direccion: </td>
  18.         <td><input type="text" name="txtDireccion" /></td>
  19.     </tr>
  20.     <tr>
  21.         <td>Telefono: </td>
  22.         <td><input type="text" name="txtTelefono" /></td>
  23.     </tr>
  24.     <tr>
  25.         <td>Subir imagen: </td>
  26.         <td><input type="file" name="uploadfile" /></td>
  27.     </tr>
  28.     <tr>
  29.         <td><input type="hidden" name="todo" value="upload"><input type="reset" value="clear"></td>
  30.         <td><input type="submit" value="Upload" /></td>
  31.     </tr>
  32. </form>
  33. </center>
  34. </BODY>
  35. </HTML>


SERVLET(lo comente segun entendi en varios tutoriales) :
Código Javascript:
Ver original
  1. package servlet;
  2.  
  3. import java.io.IOException;
  4. import java.util.Hashtable;
  5.  
  6. import javax.servlet.RequestDispatcher;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.annotation.WebServlet;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. import javazoom.upload.MultipartFormDataRequest;
  14. import javazoom.upload.UploadBean;
  15. import javazoom.upload.UploadException;
  16. import javazoom.upload.UploadFile;
  17.  
  18.  
  19.  
  20.  
  21.  
  22. @WebServlet("/ServletSubir")
  23. public class ServletSubir extends HttpServlet {
  24.     private static final long serialVersionUID = 1L;
  25.        
  26.    
  27.     public ServletSubir() {
  28.         super();
  29.        
  30.     }
  31.  
  32.    
  33.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  34.        
  35.     }
  36.  
  37.    
  38.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  39.        
  40.             /**
  41.              * Declaramos MultipartFormDaaRequest por que un Request normal no trae los valores del input Text
  42.              * y tampoco trae la imagen.
  43.              */
  44.             MultipartFormDataRequest mrequest = null;
  45.            
  46.             RequestDispatcher dispatcher = null;
  47.             /**
  48.              * UploadBean es una libreria que se usa para poder llevar objetos al servidor en este caso
  49.              * la imagen.
  50.              */
  51.             UploadBean upBean = null;
  52.            
  53.             String nombres = null;
  54.             String apellidos = null;
  55.             String direccion = null;
  56.             String telefono = null;
  57.             String todo = null;
  58.             String imagen = null;
  59.            
  60.             try{
  61.             /**
  62.              * Aqui estamos confirmando el MultipartFormDataRequest y le indicamos que recoga todo lo que
  63.              * nos esta mandando el index.
  64.              */
  65.                 mrequest=   new MultipartFormDataRequest(request);
  66.                
  67.             if (mrequest != null) {
  68.                 todo = mrequest.getParameter("todo");
  69.             }
  70.             if ((todo != null) && (todo.equalsIgnoreCase("upload"))) {
  71.                 /**
  72.                  * Usamos un HashTable que es un directorio, se podria usar como una tabla pequeña.
  73.                  * mrequest.getFiles() = recoger todos los archivos de la imagen.
  74.                  */
  75.                 Hashtable files = mrequest.getFiles();
  76.                 if ((files != null) && (!files.isEmpty())) {
  77.                     /**
  78.                      * si UploadBean sirve para que podamos subir al servidor objetos, entonces
  79.                      * UploadFile sirve para poder subir Archivos al servidor.
  80.                      *
  81.                      * En este caso, al usar el comando GET, le estamos diciendo a lo que
  82.                      * tenga dentro de sus parentecis se vaya al objeto file, pero como
  83.                      * el objeto que obtenemos es de tipo Hashtable le colocamos un cast
  84.                      * para que podamos recuperar la informacion si problemas.
  85.                      */
  86.                     UploadFile file = (UploadFile) files.get("uploadfile");
  87.                    
  88.                    
  89.                     upBean = new UploadBean();
  90.                     upBean.setFolderstore("D:\\Imagenes\\");
  91.                     /**
  92.                      * Empezamos a utilizar el UploadBean y colocamos la opcion setFolderstore
  93.                      * para poder indicar en que direcion vamos a guarda todo archivo que nos mande.
  94.                      */
  95.                    
  96.                         upBean.store(mrequest, "uploadfile");
  97.                         /**
  98.                          * Con el Store le decimos al MultipartFormRequest que obtenta tambien la imagen.
  99.                          */
  100.                        
  101.                    
  102.                         if (file != null) {
  103.                             imagen = file.getFileName();
  104.                        
  105.                             request.setAttribute("imagen", "D:\\Imagenes\\"+imagen);
  106.                             request.setAttribute("nombre", imagen);
  107.                             request.setAttribute("tipo",file.getContentType() );
  108.                             request.setAttribute("tamanio", file.getFileSize());
  109.                            
  110.                         }
  111.                        
  112.                 } else {
  113.             System.out.println("<li>No uploaded files");
  114.                 }
  115.                 if (mrequest != null) {
  116.                     /**
  117.                      * Usamos el "mrequest" por que como dije al comienzo, el request normal no funciona
  118.                      * cuando usamos un FORM MULTIPART / FORM-DATA
  119.                      */
  120.                    
  121.                     nombres = mrequest.getParameter("txtNombres");
  122.                     apellidos = mrequest.getParameter("txtApellidos");
  123.                     direccion = mrequest.getParameter("txtDireccion");
  124.                     telefono = mrequest.getParameter("txtTelefono");
  125.                 }
  126.                
  127.                     request.setAttribute("txtNombres", nombres);
  128.                     request.setAttribute("txtApellidos", apellidos);
  129.                     request.setAttribute("txtDireccion", direccion);
  130.                     request.setAttribute("txtTelefono",telefono);
  131.                
  132.            
  133.                 dispatcher = getServletContext().getRequestDispatcher("/mensaje.jsp");
  134.        
  135.             }
  136.             }catch( UploadException exc){
  137.                 System.out.println("Error en lo primero: "+exc.getMessage());
  138.             }
  139.    
  140.             dispatcher.forward(request, response);
  141.     }
  142. }

MENSAJE.JSP
Código HTML:
Ver original
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  2.     pageEncoding="ISO-8859-1"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5. <title>Mensaje</title>
  6. </head>
  7. <table border="2.0" cellpadding="3.0">
  8.     <tr>
  9.         <td colspan="2"><img src="<%=request.getAttribute("imagen")%>" /></td>
  10.     </tr>
  11.     <tr>
  12.         <td>nombre:</td>
  13.         <td><%=request.getAttribute("nombre")%></td>
  14.     </tr>
  15.     <tr>
  16.         <td>tipo:</td>
  17.         <td><%=request.getAttribute("tipo")%></td>
  18.     </tr>
  19.     <tr>
  20.         <td>tamaño:</td>
  21.         <td><%=request.getAttribute("tamanio")%> kb</td>
  22.     </tr>
  23. <br>
  24. <br>
  25.     <tr>
  26.         <td>Nombres:</td>
  27.         <td><%=request.getAttribute("txtNombres")%></td>
  28.     </tr>
  29.     <tr>
  30.         <td>Apellidos:</td>
  31.         <td><%=request.getAttribute("txtApellidos")%></td>
  32.     </tr>
  33.     <tr>
  34.         <td>Direccion:</td>
  35.         <td><%=request.getAttribute("txtDireccion")%></td>
  36.     </tr>
  37.     <tr>
  38.         <td>Telefono:</td>
  39.         <td><%=request.getAttribute("txtTelefono")%></td>
  40.     </tr>
  41. </body>
  42. </html>
  #8 (permalink)  
Antiguo 28/05/2012, 13:19
 
Fecha de Ingreso: junio-2008
Mensajes: 34
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Error con input "text","file" y servlets multipart form-data

Buenas tardes.

Ya estoy un poco loco, llevo toda la tarde dándole vueltas a importar "com.oreilly.servlet.MultipartRequest" y no lo consigo :(

Mi caso es el mismo que el de "jrevilla", pero yo no consigo ni importar el paquete...
De donde me lo puedo descargar y como lo hago??

Muchas gracias de antemano.



Un saludo!
  #9 (permalink)  
Antiguo 29/05/2012, 01:15
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Error con input "text","file" y servlets multipart form-data

http://www.servlets.com/cos/

Revisa este link: http://www.google.es/search?q=a%C3%B...&aqi=g-K3&aql=
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}

Etiquetas: enctype, file, form-data, formulario, input, multipart, txt
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:23.