2012-04-30 16 views

risposta

13

Se si desidera ottenere come File per qualche ragione, allora avete bisogno ExternalContext#getRealPath(). Questo converte un percorso web relativo in un file system del disco assoluto. Dal momento che è necessario cartella principale del web, basta passare in /:

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

Estranei al problema concreto, qualunque requisito funzionale che hai avuto in mente per il quale si pensava che avere un disco locale assoluta il percorso del file system per la cartella web è la soluzione giusta, deve essere risolto in modo diverso. E in effetti, secondo il vostro commento sul altra risposta,

perché Im cercando di caricare qualche file all'interno della cartella e utilizzando il percorso relativo

si sta andando sulla strada sbagliata. Non dovresti memorizzare i file caricati lì se hai intenzione di tenerli più a lungo della vita di distribuzione dell'app webapp. Ogni volta che si ridistribuisce la webapp (e su alcune configurazioni del server anche quando si riavvia il server), i file caricati si perderebbero completamente, semplicemente perché non sono contenuti come parte del file WAR originale. Ancor più, alcune pesanti configurazioni del server non espandono affatto WAR su disco, ma in memoria, invece, getRealPath() restituisce sempre null.

Piuttosto memorizzarlo in un corretto percorso di file system fuori dalla cartella di distribuzione del server. Aggiungi quel percorso a sua volta come un nuovo contesto server o docroot, in modo che sia accessibile su un diverso percorso di contesto (virtuale). Oppure usa un servlet che riceve dal disco uno InputStream e lo scrive su OutputStream della risposta. Si veda anche questa risposta correlato: Uploaded image only available after refreshing the page

+0

grazie per la tua risposta, Ill cercherò un po 'di più sulla memorizzazione delle immagini e torno se ho qualche domanda – hari

16

Prova

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

per costruire URL relativo alle risorse di nella vostra app.

Se si desidera che il percorso vero e proprio ...

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

bello, grazie, ma è possibile ottenere il percorso assoluto, perché Im cercando di caricare un po 'di file all'interno della cartella e con il relativo percorso Im ottenendo java.io.FileNotFoundException: \ example (Accesso negato) – hari

+0

Ho aggiunto per il 'realPath' –

0

Prova:

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

per ottenere vero e proprio percorso.

Creare un file tmp in resources/temp/per evitare qualsiasi eccezione.

0

Volevo solo ringraziare Balus C.Codice Java con JSP, nel server Tomcat/Tomee ho il seguente codice che funziona:

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; 
    } 
Problemi correlati