2012-04-30 25 views

Respuesta

13

Si desea obtener como un File por alguna razón, entonces es necesario ExternalContext#getRealPath(). Esto convierte una ruta web relativa a un sistema de archivos de disco absoluto. Ya que se necesita la carpeta raíz de la web, sólo tiene que pasar en /:

String absoluteWebPath = externalContext.getRealPath("/"); 
File webRoot = new File(absoluteWebPath); 
// ... 

Sin relación al problema concreto, cualquiera que sea requisito funcional que ha tenido en cuenta para la que pensaban que tener un disco local absoluta La ruta de acceso del sistema de archivos a la carpeta web es la solución correcta, definitivamente tiene que resolverse de manera diferente. Y, en efecto, de acuerdo con sus comentarios sobre la otra respuesta,

porque estoy tratando de subir algún archivo dentro de la carpeta y el uso de la ruta relativa

vas por el camino equivocado. No debe almacenar archivos cargados allí si tiene la intención de mantenerlos más tiempo que la vida útil de implementación de la aplicación web. Cada vez que vuelva a implementar la aplicación web (y en algunas configuraciones del servidor, incluso cuando reinicie el servidor), los archivos cargados se perderán por completo, simplemente porque no están contenidos como parte del archivo WAR original. Aún más, algunas configuraciones pesadas del servidor no expanden el WAR en el disco, pero en su lugar, en la memoria, el getRealPath() siempre devolverá null.

En lugar de almacenarlo en una ruta de sistema de archivos de disco fuera de la carpeta de despliegue del servidor. Agregue esa ruta a su vez como un nuevo contexto de servidor o docroot, para que esté accesible en una ruta de contexto diferente (virtual). O homegrow un servlet que obtiene un InputStream del disco y lo escribe en OutputStream de la respuesta. Véase también esta respuesta relacionada: Uploaded image only available after refreshing the page

+0

gracias por su respuesta, buscaré un poco más en el almacenamiento de imágenes y volveré si tengo alguna pregunta – hari

16

Trate

FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath() 

para la acumulación de URL relativos a los recursos en su aplicación.

Si desea que el camino real ...

ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance() 
      .getExternalContext().getContext(); 
String realPath = ctx.getRealPath("/"); 
+0

agradable, gracias, pero ¿es posible obtener la ruta absoluta, porque estoy tratando de subir algún archivo dentro de la carpeta y el uso de la relación ruta Estoy obteniendo java.io.FileNotFoundException: \ example (Acceso denegado) – hari

+0

Agregué para 'realPath' –

0

Probar:

String relativePath="/resources/temp/"; 
String absolutePath= FacesContext.getCurrentInstance.getExternalContext().getRealPath(relativePath); 
File file = new File(absolutePath); 

para obtener la ruta real.

Cree un archivo tmp en resources/temp/para evitar cualquier excepción.

0

Sólo quería agradecer a Balus C.Código Java con JSP, en el servidor Tomcat/Tomee que el siguiente código que funciona:

private Boolean SaveUserItemImage(Part ui, String bid) throws IOException { 

    Boolean fileCreate = false; 
    OutputStream out = null; 
    InputStream filecontent = null; 
    ExternalContext ctx = context().getExternalContext(); 
    String absoluteWebPath = ctx.getRealPath("/"); 
    String resource_path = absoluteWebPath + "\\resources\\"; 
    String image_path = resource_path + "\\" + this.itemType + "_images\\"; 
    String buildFileName = image_path + bid + "_" + getFileName(ui); 
    File files = null; 

    try { 
     files = new File(buildFileName); 
     fileCreate = true; 
    } catch (Exception ex) { 
     System.out.println("Error in Creating New File"); 
     Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    if (fileCreate == true) { 
     if (files.exists()) { 
     /// User may be using same image file name but has been editted 
     files.delete(); 
     } 

     try { 
     out = new FileOutputStream(files); 
     filecontent = ui.getInputStream(); 
     int read = 0; 
     final byte[] bytes = new byte[1024]; 
     while ((read = filecontent.read(bytes)) != -1) { 
      out.write(bytes, 0, read); 
     } 
     fileCreate = true; 
     } catch (FileNotFoundException fne) { 
     fileCreate = false; 
     Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, "SaveUserItemImage", fne); 
     } finally { 
     if (out != null) { 
      out.close(); 
     } 
     if (filecontent != null) { 
      filecontent.close(); 
     } 
     files = null; 
     } 
    } 
    return fileCreate; 
    } 
Cuestiones relacionadas