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

¿subir un archivo con multipartRequest?

Estas en el tema de ¿subir un archivo con multipartRequest? en el foro de Java en Foros del Web. Hola amigos. Tengo el siguiente problema: Tenía un formulario con un listbox de productos y unos campos, entre ellos un botón para subir una imagen. ...
  #1 (permalink)  
Antiguo 21/06/2012, 11:29
 
Fecha de Ingreso: junio-2012
Ubicación: Paradas (Sevilla)
Mensajes: 13
Antigüedad: 11 años, 10 meses
Puntos: 0
Pregunta ¿subir un archivo con multipartRequest?

Hola amigos. Tengo el siguiente problema:

Tenía un formulario con un listbox de productos y unos campos, entre ellos un botón para subir una imagen. Todo iba bien, se guardaba en la base de datos los campos y la ruta del archivo (/Imagenes/nombre_producto) y se guardaba bien la imagen, hasta que tuve que poner checkbox de todos los productos para que se puedan elegir varios productos a la vez.



Aquí empezaron los problemas, los checkbox y los botones de subir archivos no funcionan juntos, el request.getParameterValues no puedo utilizarlo cuando estoy evaluando los items del formulario porque me devuelve nulo.


Aquí el código que tenía en un servlet sin todavía meter la librería MultipartRequest:



private static final String TEMPORAL_DIR = "temp";
private static final String DESTINO_DIR = "Imagenes/productos";
private File tmp;
private File des;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, ParseException {



// declaraciones de variables a utilizar para la subida de archivos

String cabecera = null;
String contenido = null;
String rutaArchivo = null;
String[] lista = null;
String fecha = null;
int addSeguimiento=0;
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
Date fechaBUENA = null;
int tam;





// Compruebo si las carpetas existen, y si no, las creo
// ************************************************** **********
String ruta = getServletContext().getRealPath(TEMPORAL_DIR);
tmp = new File(ruta);
if (!tmp.exists()) {
tmp.mkdir();
}

ruta = getServletContext().getRealPath(DESTINO_DIR);
des = new File(ruta);
if (!des.exists()) {
des.mkdir();
}



DiskFileItemFactory dfif = new DiskFileItemFactory();
dfif.setRepository(tmp);

ServletFileUpload sfu = new ServletFileUpload(dfif);



try {
List datos = sfu.parseRequest(request);
Iterator itr = datos.iterator();

while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();

if (!item.isFormField()) {
String[] arrStr = item.getName().split(new String ("\\\\"));
String nombreArchivo = arrStr[arrStr.length - 1];

File archivo = new File(des, nombreArchivo);

item.write(archivo);

//rutaArchivo = getServletContext().getRealPath(DESTINO_DIR+"\\"+n ombreArchivo);
rutaArchivo = DESTINO_DIR+"/"+nombreArchivo;

}
else{
String campo = item.getFieldName();

if (campo.equals(new String("fecha"))) {
fecha = item.getString();
}

if(campo.equals("cabecera")) { cabecera = item.getString();}
if(campo.equals("contenido")) { contenido = item.getString();}

//ESTO NO FUNCIONA, DEVUELVE SIEMPRE NULL. SI LO PONGO FUERA DEL TRY (bajo la declaración de variables),
//SÍ LO COGE, PERO ENTONCES LOS DEMÁS CAMPOS DENTRO DEL TRY NO LOS COGE
//¡¡QUÉ PARANOIA!! SON INCOMPATIBLES

if(campo.equals("productos"))
{
lista = request.getParameterValues("productos");
}



}
}



} catch (FileUploadException ex) {
Logger.getLogger(guardaFoto.class.getName()).log(L evel.SEVERE, null, ex);

}catch (Exception ex) {
Logger.getLogger(guardaFoto.class.getName()).log(L evel.SEVERE, null, ex);
//if (ex.getMessage()=="") {}
}

[/I]



LO SIGUIENTE QUE HICE fue meter la librería MultipartRequest y utilizar en lugar
de request.getParameter, mr.getParameter siendo rm un objeto tipo MultipartRequest (y para los checkbox mr.getParameterValues ("nombre_de_los_chechboxes). Pues bien, ahora el List que utilizo para los items del formulario devuelve NULO. Y si pongo los campos fuera del try, ahora sí me
coge los valores de los checkboxes, pero el fichero no me lo crea.
No sé si hay que utilizar mr.getFile() ni cómo utilizarlo.
Aquí el nuevo código (con MultipartRequest):



package servlets;


import com.oreilly.servlet.MultipartRequest;


/**
*
* @author JAVA
*/
public class nuevoSeg extends HttpServlet {


/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/

private static final String TEMPORAL_DIR = "temp";
private static final String DESTINO_DIR = "Imagenes/productos";
private File tmp;
private File des;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, ParseException {



// declaración de variables a utilizar para la subida de los datos del formulario
String cabecera = null;
String contenido = null;
String[] lista = null;
String fecha =null;
int addSeguimiento=0;
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
Date fechaBUENA = null;
int tam;
String rutaArchivo=null;



// Compruebo si las carpetas existen y si no las creo
// ************************************************** **********
String ruta = getServletContext().getRealPath(TEMPORAL_DIR);
tmp = new File(ruta);
if (!tmp.exists()) {
tmp.mkdir();
}

ruta = getServletContext().getRealPath(DESTINO_DIR);
des = new File(ruta);
if (!des.exists()) {
des.mkdir();
}



MultipartRequest mr = new MultipartRequest(request,ruta);
Enumeration parametros = mr.getParameterNames();



DiskFileItemFactory dfif = new DiskFileItemFactory();
dfif.setRepository(tmp);

ServletFileUpload sfu = new ServletFileUpload(dfif);



try {

List datos = sfu.parseRequest(request);
Iterator itr = datos.iterator();

while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();

if (!item.isFormField()) {
String[] arrStr = item.getName().split(new String ("\\\\"));
String nombreArchivo = arrStr[arrStr.length - 1];

File archivo = new File(des, nombreArchivo);

item.write(archivo);

rutaArchivo = DESTINO_DIR+"/"+nombreArchivo;


}
else{
String campo = item.getFieldName();

if (campo.equals(new String("fecha"))) {
fecha = mr.getParameter("fecha");
}

if(campo.equals("cabecera")) { cabecera = mr.getParameter("cabecera");}
if(campo.equals("contenido")) { contenido = mr.getParameter("contenido");}
if(campo.equals("productos"))
{
lista = mr.getParameterValues("productos");
}



}
}



} catch (FileUploadException ex) {
Logger.getLogger(nuevoSeg.class.getName()).log(Lev el.SEVERE, null, ex);

}catch (Exception ex) {
Logger.getLogger(nuevoSeg.class.getName()).log(Lev el.SEVERE, null, ex);
//if (ex.getMessage()=="") {}
}




Espero que puedan ayudarme a solucionar este problema (en resumen, que con MultipartRequest suba un archivo y guarde los campos de los checboxes), pues estoy ya bastante mareado,

GRACIAS DE ANTEMANO AMIGOS. XAO..
  #2 (permalink)  
Antiguo 21/06/2012, 12:51
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: ¿subir un archivo con multipartRequest?

Hola:

Si usas Multipart, los parámetros del formulario se deben leer de otra forma. Echa un ojo a este enlace http://chuwiki.chuidiang.org/index.p...upload_con_JSP

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 22/06/2012, 07:20
 
Fecha de Ingreso: junio-2012
Ubicación: Paradas (Sevilla)
Mensajes: 13
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: ¿subir un archivo con multipartRequest?

Hola chuidang, gracias x tu respuesta. Ya sabía cómo se cogen los parámetros usando multipart/form-data, pero ese no era mi problema.
Mi problema sigue siendo el mismo.

Si uso multipart/form-data ¿cómo cojo los valores multievaluados de un checkbox? Porque utilizando item.getField() no me lo coje, coje nulo, tendría que utilizar request.getParameterValues(), y fileupload no me lo permite.
Subir el archivo y los campos y guardarlos en la BBDD me va bien, pero en cuanto he metido los checkbox no.

Después, como ya he dicho, utilicé MultipartRequest, que sí me coge los campos multievalueados con mr.getParameterValues(nombre_campo) siendo mr un objeto MultipartRequest, pero sigo sin saber cómo subir el archivo utilizando MultipartRequest.

LO QUE NECESITO SABER:

Si tengo:
MultipartRequest mr = new MultipartRequest(request,ruta_archivo);
String cabecera = mr.getParameter("cabecera");
String contenido = mr.getParameter("contenido");
String[] productos = mr.getParameterValues("productos");
Los valores anteriores sí me los coge, pero:
¿Cómo consigo subir el archivo?


Gracias chuidiang, espero que me haya explicado ahora mejor. A ver si alguien conoce la solución a esto.
  #4 (permalink)  
Antiguo 22/06/2012, 18:16
 
Fecha de Ingreso: junio-2012
Ubicación: Paradas (Sevilla)
Mensajes: 13
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: ¿subir un archivo con multipartRequest?

Bueno, ya lo he resuelto por mí mismo después de probar muchas cosas. Ya sé cómo subir un archivo con MultiparRequest y captar los demás parámetros del formulario (incluídos los multievaluados de los checkboxes).
  #5 (permalink)  
Antiguo 29/06/2012, 09:38
 
Fecha de Ingreso: junio-2012
Ubicación: Paradas (Sevilla)
Mensajes: 13
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: ¿subir un archivo con multipartRequest?

//ESTE SERVLET SIRVE PARA COGER LOS DATOS DE UN FORMULARIO RESPECTO A UN
//SEGUIMIENTO QUE SE HACE SOBRE VARIOS PRODUCTOS (CHECKBOXES) Y SUBIENDO
//UNA IMAGEN, LOS VALORES DE LOS CHECKBOXS, UN TÍTULO, DESCRIPCIÓN Y FECHA
//COMO ES LÓGICO, USANDO MULTIPARTREQUEST:
//LA IMAGEN LA GUARDO EN UNA CARPETA EN MI PROYECTO /Imagenes/Productos/nombre_archivo.

package servlets;


import Clases.Producto;
import Clases.Seguimiento;
import Persistencia.PersistenciaProducto;
import com.oreilly.servlet.MultipartRequest;
import java.io.*;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*
* @author JAVA
*/
public class nuevoSeg extends HttpServlet {


/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/

//private static final String TEMPORAL_DIR = "temp";
private static final String DESTINO_DIR = "Imagenes/productos";
//private File tmp;
private File des;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, ParseException {



// declaración de variables a utilizar para la subida de los datos del formulario
String cabecera = null;
String contenido = null;
String[] lista = null;
String fecha =null;
String nombreArchivo = null;
int addSeguimiento=0;
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
Date fechaBUENA = null;
int tam;
String rutaArchivo=null;



// Compruebo si las carpetas existen y si no las creo
// ************************************************** **********
/*String ruta = getServletContext().getRealPath(TEMPORAL_DIR);
tmp = new File(ruta);
if (!tmp.exists()) {
tmp.mkdir();
}*/

String ruta = getServletContext().getRealPath(DESTINO_DIR);
des = new File(ruta);
if (!des.exists()) {
des.mkdir();
}



MultipartRequest mr = new MultipartRequest(request,ruta);
//Enumeration parametros = mr.getParameterNames();


contenido = mr.getParameter("contenido");
cabecera = mr.getParameter("cabecera");
//los valores de los checkboxes:
lista = mr.getParameterValues("productos");
fecha = mr.getParameter("fecha");


File f = mr.getFile("archivo");
String rutaReal = f.getPath();
String[] arrStr = rutaReal.split(new String("\\\\"));
String nombreA = arrStr[arrStr.length - 1];
File archivo = new File(des, nombreA);

rutaArchivo = DESTINO_DIR+"/"+nombreA;
boolean hecho = f.mkdir();



try {
fechaBUENA = df.parse(fecha.replace("/", "-"));
} catch (ParseException ex1) {
fecha = "";
}

if(fecha.equals("") || cabecera.equals("") || contenido.equals("") ) {
//faltan campos por rellenar
addSeguimiento = 3;
}
else {

// Guardamos los seguimientos para los productos incluidos en "lista" <-- los checkbox activos
for(int i=0;i<lista.length;i++)
{
Producto p = PersistenciaProducto.obtenerProducto(lista[i]);
Seguimiento seguimiento = new Seguimiento(p, cabecera, contenido, fechaBUENA, rutaArchivo);
addSeguimiento = PersistenciaProducto.insertarSeguimiento(seguimien to);
}


// INSERCION DEL ATRIBUTO Y REDIRECCION
request.setAttribute("insertado", addSeguimiento);
RequestDispatcher rd = request.getRequestDispatcher("addSeguimiento.jsp") ;
rd.forward(request, response);


}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
processRequest(request, response);
} catch (ParseException ex) {
Logger.getLogger(guardaSeg.class.getName()).log(Le vel.SEVERE, null, ex);
}
}

/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
processRequest(request, response);
} catch (ParseException ex) {
Logger.getLogger(guardaSeg.class.getName()).log(Le vel.SEVERE, null, ex);
}
}


/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
  #6 (permalink)  
Antiguo 29/06/2012, 09:53
 
Fecha de Ingreso: junio-2012
Ubicación: Paradas (Sevilla)
Mensajes: 13
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: ¿subir un archivo con multipartRequest?

se me olvidaba, "archivo" es el nombre (name) del input file, si quereis subir más archivos, sólo teneis que ponerles otro nombre, por ejemplo "archivo2" y hacer lo mismo:

File f = mr.getFile("archivo2");
  #7 (permalink)  
Antiguo 12/12/2013, 11:21
Avatar de josrv089  
Fecha de Ingreso: agosto-2013
Ubicación: Alajuela
Mensajes: 7
Antigüedad: 10 años, 8 meses
Puntos: 0
De acuerdo Respuesta: ¿subir un archivo con multipartRequest?

Esto es justamente lo que ando buscando!!! Voy a revisarlo y pues muchas gracias por publicar tu solución....
Veo que hace bastante de esto pero de igual forma no encuentro otra posible solución.

Etiquetas: string
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 04:41.