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

FileUpload objeto request no devuelve datos

Estas en el tema de FileUpload objeto request no devuelve datos en el foro de Java en Foros del Web. Hola a todos, os cuento mi problema a ver si alguien me puede orientar: estoy intentando subir ficheros al servidor por medio de fileupload. la ...
  #1 (permalink)  
Antiguo 14/05/2009, 03:05
 
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
FileUpload objeto request no devuelve datos

Hola a todos,

os cuento mi problema a ver si alguien me puede orientar:

estoy intentando subir ficheros al servidor por medio de fileupload. la cuestión es q en una parte de mi aplicación lo conseguí y desde q me puse a hacerlo en otra sección diferente de la misma aplicación ya no me va. ni en una ni en la otra.
El problema es q el objeto request está vacío...
he mirado tutoriales de internet y he mirado en este foro, pero no encuentro nada solo q segun la pagina de fileupload si el objeto request esta vacio es pq se ha procesado ya en algún otro lugar... pero mi aplicación pasa directamente del fichero formulario.jsp al fichero procesaformulario.jsp...

alguna idea?

Gracias de antemano.
  #2 (permalink)  
Antiguo 14/05/2009, 03:34
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: FileUpload objeto request no devuelve datos

Wenas

Prueba con oreilly.

Saludos.
  #3 (permalink)  
Antiguo 14/05/2009, 03:59
 
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: FileUpload objeto request no devuelve datos

Cita:
Iniciado por elAntonie Ver Mensaje
Wenas

Prueba con oreilly.

Saludos.
Hola elAntonie, gracias por responder

he mirado en oreillynet y el unico post q hay sobre fileupload habla más bien de como subir ficheros en aplicaciones no web.

¿conoces algún link concreto dentro q pueda tener información relevante?

¿alguna otra idea de pq el objeto request no almacena los datos?
  #4 (permalink)  
Antiguo 14/05/2009, 05:01
 
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: FileUpload objeto request no devuelve datos

Vale... trasteando por internet he visto q oreilly es un paquete de java... no solo la página web... jejejeje :p

voy a probar con él a ver si va y con el resultado ya posteo algo.
  #5 (permalink)  
Antiguo 14/05/2009, 05:53
 
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: FileUpload objeto request no devuelve datos

Hola de nuevo,

pues he instalado el .jar de oreilly y nada... mi código:
Código:
try
		{
			String localizacion = request.getParameter("localizacion");
			String descripcion  = request.getParameter("descripccion");
			String []aux;
			
			String ruta = "S:\\Local";
			
			MultipartRequest mpr = new MultipartRequest(request,ruta,1024);
			
			out.print("<br> Llega aqui");
			
		}
		
		catch(Exception e)
		{
			out.print("<br> Error: "+e.getMessage());
		}
en principio lo hace correcto, no salta ninguna excepcion, sin embargo no guarda ningun fichero en disco...
haciendo una traza el objeto request sigue vacío...
¿¿alguien sabe pq puede ser??
  #6 (permalink)  
Antiguo 14/05/2009, 06:21
 
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: FileUpload objeto request no devuelve datos

Bueno por fin lo solucioné... era una tontería aunq me ha tenido toda la mañana...

mis campos input eran:
<input type="file" ... id="fic" ...></input>
y tenian q ser
<input type="file ... name="fic" ...> </input>

o sea q con la tonteria de poner ID en vez de NAME no iba...
  #7 (permalink)  
Antiguo 14/05/2009, 09:32
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: FileUpload objeto request no devuelve datos

Buffff si ya te lo has contestado todo tu. Asi da gusto, alguien que se lo curra y no se limita a esperar las respuestas. Bravo!!

Yo tambien usaba el paquete de apache y me iba muy bien, pero lo deje de usar, y me puse con oreilly por una cosa muy tonta que me paso. no me dejaba meter ficheros con nombres muy largos (ruta+fichero).

Oreilly si me dejo.

Creo que lo principal de oreilly es que es muy claro, obtienes un formulario y de ahi obtienes todos los campos del mismo, lo unico que tienes que preguntar es si es de tipo fichero o de tipo campo.

Es muy simple de usar.

Saludos.

PD. id y name no son excluyentes. Es muy normal tener <input type="file" ... id="fic" name="fic"></input>
  #8 (permalink)  
Antiguo 18/05/2009, 02:50
 
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: FileUpload objeto request no devuelve datos

Cita:
Iniciado por elAntonie Ver Mensaje
Buffff si ya te lo has contestado todo tu. Asi da gusto, alguien que se lo curra y no se limita a esperar las respuestas. Bravo!!

Yo tambien usaba el paquete de apache y me iba muy bien, pero lo deje de usar, y me puse con oreilly por una cosa muy tonta que me paso. no me dejaba meter ficheros con nombres muy largos (ruta+fichero).

Oreilly si me dejo.

Creo que lo principal de oreilly es que es muy claro, obtienes un formulario y de ahi obtienes todos los campos del mismo, lo unico que tienes que preguntar es si es de tipo fichero o de tipo campo.

Es muy simple de usar.

Saludos.

PD. id y name no son excluyentes. Es muy normal tener <input type="file" ... id="fic" name="fic"></input>

Hola elAntoine,

ya he conseguido hacerlo si, pero ahora tengo un error nuevo,
si pongo enctype=multipar... entonces los campos de tipo text o hidden me devuelven null cuando los intento capturar con un request.getParameter

y si no pongo ese enctype entonces no me sube el fichero...

dices q con oreilly se puede obtener el formulario entero y conseguir todos sus campos... ¿me podrías poner algun ejemplo? ¿es posible obtener los campos antes de escribir los ficheros en el servidor? pq yo paso la ruta como parametro y al construir el objeto multipartrequest me escribe los ficheros y ahi aun no he podido coger el parametro ruta del formulario.

Muchas gracias de antemano.
  #9 (permalink)  
Antiguo 18/05/2009, 04:02
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: FileUpload objeto request no devuelve datos

No, no. Olvidate del request.getParameter().

Te pongo un ejemplo que creo que veras cristalino. Este es un servlet que recibe un formulario multpart (si no es multipart, no hay fichero que valga), con un campo tipo file y otros campos, texto, hidden, y demas zarandajas.

CPlantillaDoc es una clase, uno de sus campos es el fichero (un inputStream), el resto de los campos del formulario son descripcion, procedencia, e id, te explico esto para que no busques tres pies al gato, y te centres en lo que de verdad interesa.

Observa como recorre el 'formulario' con el while y sencillamente preguntando si es un campo tipo file (isFile()) o si es tipo 'otro tipo de campo' (isParam()), obtiene cada dato.

No hace falta que te lo diga, pero ya sabras que SOLO llegan los campos que estan habilitados. Cualquier campo DISABLED NO SE RECOGE.

Dicho esto, vamos al grano. Ahi tienes el service() de mi servlet. (Ojito que esta registrado)

Código:
  public void service(HttpServletRequest request, 
                      HttpServletResponse response) throws ServletException, 
                                                           IOException {

    Traza.debug(this, "->service()");
      HttpSession session = request.getSession(true);
    DocumentosBD documentosBD = new DocumentosBD(); 
    PrintWriter out = response.getWriter();
    response.setContentType("text/html");
    boolean fin = false;

    String login = session.getAttribute("login").toString();
    String dir_ip = request.getRemoteAddr();
    String id_asesoria = session.getAttribute("var_id_asesoria").toString();
      CPlantillaDoc cPlantillaDoc = new CPlantillaDoc();
      String extension = "";

    //parametros recibidos del formulario
    String nombre = "";
    String procedencia = "";
		String id = "";//el id_expediente o el id_tramite
    try 
    {
      MultipartParser mp = new MultipartParser(request, 50 * 1024 * 1024, false, false); // 50MB
      Part part;
      while ((part = mp.readNextPart()) != null)  // recorremos el 'formulario'
     {
        if (part.isParam()) // es de tipo 'loqueseamenosfile'?? ein??
        {
          // Tratamos los parametros que vienen en el request
          String name = part.getName();
          ParamPart paramPart = (ParamPart)part;
          String valorcadena = paramPart.getStringValue();
          fin = null == valorcadena;
          if (!fin) {
            if (name.equals("descripcion")) 
              nombre = valorcadena;
            if (name.equals("procedencia")) 
              procedencia = valorcadena;
            if (name.equals("id")) 
              id = valorcadena;

          }
        } 
        else if (part.isFile()) //es el fichero??
        {
          FilePart filePart = (FilePart)part;
          String nombreFichero = filePart.getFileName();
          int posipunto = nombreFichero.lastIndexOf(".");
          if (posipunto > -1)
            extension = nombreFichero.substring ( posipunto + 1, nombreFichero.length());
          else
            extension = "txt";
          cPlantillaDoc.setNom_plantilla(nombre);
          cPlantillaDoc.setDocumento(filePart.getInputStream());
          cPlantillaDoc.setId_asesoria(id_asesoria);
        } 
      } 
//esto a ti te da lo mismo
      try {
      	if (procedencia.equals("E"))
        	documentosBD.adjuntarDocumentoExpediente ( id, cPlantillaDoc, login, dir_ip, extension );
        else
        	documentosBD.adjuntarDocumentoTramite ( id, cPlantillaDoc, login, dir_ip, extension );	
      } catch (Exception e) {
        Traza.exception(this, "->service->Exception->", e);
        muestraError(request, e.getMessage(), out);
      }

    } catch (IOException primEx) {
      Traza.exception(this, "->service->IOException->" , primEx);
      muestraError(request, "Error almacenando el fichero. Intentelo de nuevo", out);
    } catch (Exception exc) {
      muestraError(request, "Error guardando el fichero. Intentelo de nuevo", out);
		}
    out.println("<html>");
    out.println("<head>");
    out.println("<title></title>");
    out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">");
      out.println("<script language='JavaScript' src='" + request.getContextPath() + "/expedientes/gestion/js/adjuntar_documento.js'></script>");
    out.println("</head>");
    out.println("<body onload=\"ok();\">");
    out.println("</body>");
    out.println("</html>");

    //Si todo ha ido bien se manda la p?gina de ?xito
    out.close();
  }
Sencillo??

Saludos.

Última edición por elAntonie; 18/05/2009 a las 04:08
  #10 (permalink)  
Antiguo 18/05/2009, 04:12
 
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: FileUpload objeto request no devuelve datos

Cita:
Iniciado por elAntonie Ver Mensaje
No, no. Olvidate del request.getParameter().

Te pongo un ejemplo que creo que veras cristalino. Este es un servlet que recibe un formulario multpart (si no es multipart, no hay fichero que valga), con un campo tipo file y otros campos, texto, hidden, y demas zarandajas.

CPlantillaDoc es una clase, uno de sus campos es el fichero (un inputStream), el resto de los campos del formulario son descripcion, procedencia, e id, te explico esto para que no busques tres pies al gato, y te centres en lo que de verdad interesa.

Observa como recorre el 'formulario' con el while y sencillamente preguntando si es un campo tipo file (isFile()) o si es tipo 'otro tipo de campo' (isParam()), obtiene cada dato.

No hace falta que te lo diga, pero ya sabras que SOLO llegan los campos que estan habilitados. Cualquier campo DISABLED NO SE RECOGE.

Dicho esto, vamos al grano. Ahi tienes el service() de mi servlet. (Ojito que esta registrado)

Código:
  public void service(HttpServletRequest request, 
                      HttpServletResponse response) throws ServletException, 
                                                           IOException {

    Traza.debug(this, "->service()");
      HttpSession session = request.getSession(true);
    DocumentosBD documentosBD = new DocumentosBD(); 
    PrintWriter out = response.getWriter();
    response.setContentType("text/html");
    boolean fin = false;

    String login = session.getAttribute("login").toString();
    String dir_ip = request.getRemoteAddr();
    String id_asesoria = session.getAttribute("var_id_asesoria").toString();
      CPlantillaDoc cPlantillaDoc = new CPlantillaDoc();
      String extension = "";

    //parametros recibidos del formulario
    String nombre = "";
    String procedencia = "";
		String id = "";//el id_expediente o el id_tramite
    try 
    {
      MultipartParser mp = new MultipartParser(request, 50 * 1024 * 1024, false, false); // 50MB
      Part part;
      while ((part = mp.readNextPart()) != null)  // recorremos el 'formulario'
     {
        if (part.isParam()) // es de tipo 'loqueseamenosfile'?? ein??
        {
          // Tratamos los parametros que vienen en el request
          String name = part.getName();
          ParamPart paramPart = (ParamPart)part;
          String valorcadena = paramPart.getStringValue();
          fin = null == valorcadena;
          if (!fin) {
            if (name.equals("descripcion")) 
              nombre = valorcadena;
            if (name.equals("procedencia")) 
              procedencia = valorcadena;
            if (name.equals("id")) 
              id = valorcadena;

          }
        } 
        else if (part.isFile()) //es el fichero??
        {
          FilePart filePart = (FilePart)part;
          String nombreFichero = filePart.getFileName();
          int posipunto = nombreFichero.lastIndexOf(".");
          if (posipunto > -1)
            extension = nombreFichero.substring ( posipunto + 1, nombreFichero.length());
          else
            extension = "txt";
          cPlantillaDoc.setNom_plantilla(nombre);
          cPlantillaDoc.setDocumento(filePart.getInputStream());
          cPlantillaDoc.setId_asesoria(id_asesoria);
        } 
      } 
//esto a ti te da lo mismo
      try {
      	if (procedencia.equals("E"))
        	documentosBD.adjuntarDocumentoExpediente ( id, cPlantillaDoc, login, dir_ip, extension );
        else
        	documentosBD.adjuntarDocumentoTramite ( id, cPlantillaDoc, login, dir_ip, extension );	
      } catch (Exception e) {
        Traza.exception(this, "->service->Exception->", e);
        muestraError(request, e.getMessage(), out);
      }

    } catch (IOException primEx) {
      Traza.exception(this, "->service->IOException->" , primEx);
      muestraError(request, "Error almacenando el fichero. Intentelo de nuevo", out);
    } catch (Exception exc) {
      muestraError(request, "Error guardando el fichero. Intentelo de nuevo", out);
		}
    out.println("<html>");
    out.println("<head>");
    out.println("<title></title>");
    out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">");
      out.println("<script language='JavaScript' src='" + request.getContextPath() + "/expedientes/gestion/js/adjuntar_documento.js'></script>");
    out.println("</head>");
    out.println("<body onload=\"ok();\">");
    out.println("</body>");
    out.println("</html>");

    //Si todo ha ido bien se manda la p?gina de ?xito
    out.close();
  }
Sencillo??

Saludos.

mmm pues asi por lo q he visto, si, parece q es muy sencillo :p jejejej
ahora me voy a poner con ello en mi aplicación a ver si consigo dejarlo hecho ya de una vez q le estoy dedicando demasiado tiempo a este apartado.

Muchas gracias elAntoine :)
  #11 (permalink)  
Antiguo 18/05/2009, 04:21
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: FileUpload objeto request no devuelve datos

De nada, para eso estamos.

Saludos.
  #12 (permalink)  
Antiguo 29/07/2009, 12:53
 
Fecha de Ingreso: abril-2009
Mensajes: 66
Antigüedad: 15 años
Puntos: 0
Respuesta: FileUpload objeto request no devuelve datos

Buenas.

Acabo de leerme el hilo entero. He visto que usais el jar de oreilly. Yo sigo usando la de fileupload. Por lo que he visto en el código de ejemplo, la forma de detectar si el parámetro es un fichero o un campo de texto normal es de forma parecida con el .isFormField(). El problema que encuentro es que en los 2 casos se tiene que recorrer el iterador o el objeto que usa oreilly con un bucle while.

Si por ejemplo se envia un formulario con varios campos y 2 ficheros, y hay algun dato erróneo. Puede darse el caso de que se envie una imagen a pesar de que el formulario en si sea incorrecto.

¿Se podría acceder a los parámetros de forma directa sin recorrer mediante un bucle para comprobar antes que los ficheros sean correctos, y luego dentro del bucle while enviarlos?

Yo creo que no se puede hacer. He estado buscando un buen rato en google y nada... A lo mejor la mejor solución en mi caso es comprobar en el bucle while() los ficheros y si está todo correcto enviar los ficheros.

Saludos
  #13 (permalink)  
Antiguo 30/07/2009, 01:02
 
Fecha de Ingreso: julio-2009
Mensajes: 24
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: FileUpload objeto request no devuelve datos

Hola,

Que bien me hubiera venido este post un tiempo atras....

Solo quería comentar que con el fileUpload también se hace practicamente de la misma forma:

Código PHP:
File fichero null;
      while (
i.hasNext()) {

        
actual = (FileItemi.next();
        if (!
actual.isFormField()) {//Si no es un campo del formulario, es el archivo, sino....
          
String fileName actual.getName();

          
fichero = new File(fileName);

          
fichero = new File("C:\\temp\\" fichero.getName());

          
actual.write(fichero);
        }
      } 
Saludos,
Nicte
  #14 (permalink)  
Antiguo 30/07/2009, 01:57
 
Fecha de Ingreso: abril-2009
Mensajes: 66
Antigüedad: 15 años
Puntos: 0
Mensaje Respuesta: FileUpload objeto request no devuelve datos

Cita:
Iniciado por Nicte04 Ver Mensaje
Hola,

Que bien me hubiera venido este post un tiempo atras....

Solo quería comentar que con el fileUpload también se hace practicamente de la misma forma:

Código PHP:
File fichero null;
      while (
i.hasNext()) {

        
actual = (FileItemi.next();
        if (!
actual.isFormField()) {//Si no es un campo del formulario, es el archivo, sino....
          
String fileName actual.getName();

          
fichero = new File(fileName);

          
fichero = new File("C:\\temp\\" fichero.getName());

          
actual.write(fichero);
        }
      } 
Saludos,
Nicte
Hola Nicte. El código que has usado es parecido al que uso, pero tiene el problema de que si tienes que subir varios ficheros y el primero es incorrecto, se sube el primero aunque no lo debería hacer.

A ver si hoy encuentro la manera de hacerlo bien.

Saludos
  #15 (permalink)  
Antiguo 30/07/2009, 04:06
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: FileUpload objeto request no devuelve datos

Hola a los 2.

Para corregir el error de los campos no-fichero podeis recurrir, por ejemplo, a javascript, tal que no se envie el formulario si hay algun dato erroneo.

Para el caso que expone Leunamal, al hacerlo con un while, podriais comprobar la IOException que lanzaria si el fichero es erroneo (el constructor FilePart fallaria), y colocar una bandera para no seguir con la ejecucion, o en caso de que, de un error el segundo fichero y el primero se haya guardado bien, borrarlo.

algo del estilo:

Código:
boolean todook = true;
while ((part = mp.readNextPart()) != null && todook)
{
    if (part.isFile()) //es el fichero??
     {
              try
             {
                     FilePart filePart = (FilePart)part;

              }catch (IOEXception e)
              {
                        todook = false;
                        //borrar posibles ficheros que se hayan guardado
               }
      }
}
mas o menos

Saludos.
  #16 (permalink)  
Antiguo 30/07/2009, 04:19
 
Fecha de Ingreso: abril-2009
Mensajes: 66
Antigüedad: 15 años
Puntos: 0
Mensaje Respuesta: FileUpload objeto request no devuelve datos

Cita:
Iniciado por elAntonie Ver Mensaje
Hola a los 2.

Para corregir el error de los campos no-fichero podeis recurrir, por ejemplo, a javascript, tal que no se envie el formulario si hay algun dato erroneo.

Para el caso que expone Leunamal, al hacerlo con un while, podriais comprobar la IOException que lanzaria si el fichero es erroneo (el constructor FilePart fallaria), y colocar una bandera para no seguir con la ejecucion, o en caso de que, de un error el segundo fichero y el primero se haya guardado bien, borrarlo.

algo del estilo:

Código:
boolean todook = true;
while ((part = mp.readNextPart()) != null && todook)
{
    if (part.isFile()) //es el fichero??
     {
              try
             {
                     FilePart filePart = (FilePart)part;

              }catch (IOEXception e)
              {
                        todook = false;
                        //borrar posibles ficheros que se hayan guardado
               }
      }
}
mas o menos

Saludos.
Hola elAntonie.

Gracias por responder. Por javascript lo he intentado hacer usando también el framework jquery, pero parece ser que hay problemas. Haré lo que comentas de borrar el primer fichero o el segundo en caso de que haya algun tipo de error.

Gracias por las respuestas.

Un saludo
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 01:37.