2012-04-30 6 views

Odpowiedz

13

Jeśli chcesz dostać go jako File z jakiegoś powodu, to trzeba ExternalContext#getRealPath(). To konwertuje względną ścieżkę do bezwzględnego systemu plików na dysku. Ponieważ trzeba Katalog główny WWW, tylko przechodzą w /:

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

niezwiązane do konkretnego problemu, niezależnie funkcjonalny wymóg miałeś na myśli, dla których myślałeś, że mając absolutną lokalnego dysku Ścieżka do systemu plików do folderu internetowego jest właściwym rozwiązaniem, zdecydowanie należy rozwiązać inaczej. I rzeczywiście, jak na swój komentarz na drugiej odpowiedzi,

ponieważ Im próbuje przesłać jakiś plik w katalogu i przy użyciu ścieżki względnej

idziesz złą drogą. Nie przechowuj tam przesłanych plików, jeśli zamierzasz je przechowywać dłużej niż okres istnienia wdrożenia webapp. Za każdym razem, gdy przenosisz aplikację webapp (i na niektóre konfiguracje serwerów nawet po ponownym uruchomieniu serwera), przesłane pliki zostaną całkowicie utracone, po prostu dlatego, że nie są zawarte jako część oryginalnego pliku WAR. Co więcej, niektóre konfiguracje ciężkich serwerów nie rozszerzają w ogóle WAR na dysku, ale w pamięci, getRealPath() będzie zawsze zwracać null.

Zamiast przechowywać go w ścieżce systemowej pliku dyskowego naprawiony poza folderem wdrażania serwera. Dodaj tę ścieżkę jako nowy kontekst serwera lub docroot, aby był dostępny w innej (wirtualnej) ścieżce kontekstu. Lub napisz aplet, który pobiera z dysku InputStream i zapisuje go na OutputStream odpowiedzi. Zobacz także te powiązane odpowiedź: Uploaded image only available after refreshing the page

+0

dzięki za odpowiedź, Zrobię trochę więcej na przechowywanie zdjęć i wróci, jeśli mam jakieś pytanie – hari

16

Spróbuj

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

dla budowy względny adres URL do zasobów aplikacji.

Jeśli chcesz prawdziwą ścieżkę ...

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

ładne, dzięki ale czy to możliwe, aby uzyskać bezwzględną ścieżkę, ponieważ Im próbuje przesłać jakiś plik w katalogu i przy użyciu względny ścieżka Im get java.io.FileNotFoundException: \ example (Odmowa dostępu) – hari

+0

Dodałem dla 'realPath' –

0

Spróbuj:

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

dostać prawdziwą drogę.

Utwórz plik tmp w zasobach/temp /, aby uniknąć wyjątków.

0

Chciałam tylko podziękować Balus C.Kod Java z JSP w serwerze Tomcat/Tomee I dodaje kod, który działa:

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; 
    } 
Powiązane problemy