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