Java - Subida de ficheros a mi proyecto web

 
Vista:

Subida de ficheros a mi proyecto web

Publicado por Alfonso (2 intervenciones) el 24/01/2013 11:49:02
Hola a todos,

Tengo un problema con una cuestión de subidas de ficheros dentro de mi aplicación web en java-jsp, os cuento el entorno y que programas utilizo:

Eclipse - IDE
Tomcat 7 para desplegar mi war
Mysql 5 como base de datos
Tipo de proyecto:Dinamic Web Proyect

El problema es que dentro de mi propio proyecto, o sea en la carpeta WebContent creo una carpeta(FIcheros) donde quiero grabar todos los ficheros que subo desde mi aplicacion web, pero me he encontrado el problema que a veces se graban y a veces no, dandome el siguiente error cuando no se graba, parece que el tomcat 7 me cambia el directorio real por un directorio temporal, algunas veces si y otras veces no, y no entiendo que pasa:

Error que da cuando no se graba:

java.io.FileNotFoundException: C:\Users\aholguin\AppData\Local\Temp\upload_5bfcce d3_13c6177077c__8000_00000002.tmp (El sistema no puede encontrar el archivo especificado)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at org.apache.tomcat.util.http.fileupload.disk.DiskFi leItem.write(DiskFileItem.java:455)
at Servlets.servletMensajes.processRequestLoadFile(se rvletMensajes.java:866)
at Servlets.servletMensajes.processRequestGrabaMensaj eConductor(servletMensajes.java:259)
at Servlets.servletMensajes.processRequest(servletMen sajes.java:107)
at Servlets.servletMensajes.doPost(servletMensajes.ja va:56)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:722)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBas e.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(A ccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.p rocess(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnect ionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$SocketProce ssor.run(AprEndpoint.java:1805)
at java.util.concurrent.ThreadPoolExecutor.runWorker( Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (Unknown Source)
at java.lang.Thread.run(Unknown Source)


Mi codigo java para la subida :

private boolean processRequestLoadFile(HttpServletRequest request,HttpServletResponse response, String codMensaje, String nombre) throws ServletException, IOException
{
boolean isMultipart =ServletFileUpload.isMultipartContent(request);
String codmensaje=codMensaje;
boolean rutaCreada=true;
boolean rutaAppCreada=true;
String raiz = Util.leerDirectorio(Atributos.PATHRAIZ);
String rutafichero = Util.leerDirectorio(Atributos.PATHFICHEROUPLOAD);
String nombrefichero="";
String extfichero="";
File path_Unidad = new File(raiz+"\\"+rutafichero+"\\"+nombre);

String root = request.getServletContext().getRealPath("/");
log.info("root:"+root);
String ruta=root+rutafichero+"\\"+nombre;

File path_App = new File(ruta);

if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);

try {

List items = upload.parseRequest(request);
Iterator iterator = items.iterator();
while (iterator.hasNext()) {
FileItem item = (FileItem) iterator.next();

if (!item.isFormField() && !item.getName().equals(""))
{

String fileName = item.getName();
//if(item.getSize()<6200000)
//{
extfichero=fileName.substring(fileName.indexOf("." ));
nombrefichero=fileName.substring(0, fileName.indexOf("."))+"_"+codmensaje;

if (!path_Unidad.exists())
{
rutaCreada = path_Unidad.mkdirs();
}
if(rutaCreada)
{
File fichero_Unidad = new File(path_Unidad +"\\"+nombrefichero+extfichero);
item.write(fichero_Unidad);
log.info("Fichero creado OK:"+path_Unidad +"\\"+nombrefichero+extfichero);

}

if(!path_App.exists())
{
rutaAppCreada=path_App.mkdirs();
}
if(rutaAppCreada)
{
//String path_completo = request.getServletContext().getRealPath("/")+rutafichero+"\\"+nombre+"\\"+ nombrefichero +extfichero;
File fichero_app = new File(path_App +"\\"+ nombrefichero +extfichero);
item.write(fichero_app);
log.info("Fichero creado OK:"+path_App +"\\"+nombrefichero+extfichero);
}
//}else return false;
}
}

} catch (FileUploadException e) {
log.error(e.getMessage());
e.printStackTrace();
return false;
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
return false;
}

}
return true;
}


Muchas gracias por todo, espero que alguien me pueda ayudar, por que me es necesario para acabar un proyecto.

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder

Subida de ficheros a mi proyecto web

Publicado por Carlos (2 intervenciones) el 29/01/2013 17:51:23
Por lo que sale en tu log, el problema reside en que no encuentra el archivo (una de las partes, ya que es un multipart). Lo mas probable es que sea tema de las rutas, te diria que vigilases las mayusculas y minusculas, ya que apache las distingue y quiza lo que crees que viene en minuscula esta en mayuscula y viceversa, y por si las moscas, las slashes de las rutas de windows ("\\") las dejaria en formato backslash ("/") y que la jvm decida que es lo apropiado.

Por lo general las slashes no suelen causar ningun problema, ya que la jvm se encarga de traducirlas de forma correcta, pero asi eliminas opciones.

Un prueba que te puede ser muy util es tratar de operar con el archivo en una ruta menos larga, como en el root de tu servlet o en un directorio de prubas en plan /pruebas/archivo.ext para no necesitar tener en cuenta tantas cosas, quiza te encamine hacia la solucion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Subida de ficheros a mi proyecto web

Publicado por Alfonso (2 intervenciones) el 06/02/2013 13:23:40
Muchas gracias por responder,

Pero creo que el problema no estaba en la cuestión de la ruta, si no en el metodo "write" de la clase FileItem, ya que en su documentación pone:

This method is not guaranteed to succeed if called more than once for the same item. This allows a particular implementation to use, for example, file renaming, where possible, rather than copying all of the underlying data, thus gaining a significant performance benefit.

Y yo lo estoy llamando dos veces en mi codigo, por eso la segunda vez falla y me va a buscar el fichero a una ruta que no existe.

Creo que con esto lo he solucionado.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar