2016-11-29 4 views
0

Ich verwende primefaces, um ein Bild hochzuladen, es zuzuschneiden und dann das endgültige Bild auf einem graphicImage anzuzeigen.Grundflächen graphicImage Stream nicht geschlossen, Datei gesperrt

Der Prozess funktioniert gut, aber das Problem ist, dass, wenn ich das endgültige Bild auf dem GraphicImage anzeigen, der Stream nicht geschlossen ist und die Datei von java.exe gehalten wird, so habe ich Probleme auf Löschen der Dateien/Verzeichnis zum Beispiel, wenn der Benutzer sich abmeldet, weil es nur ein temporäres Verzeichnis ist.

Dies ist der Getter meines StreamedContent:

public StreamedContent getGraphicCropped() { 
    try{ 
     if (newImageName != null) { 
      File file2 = new File(pathCroppedImage); 
      InputStream input = new FileInputStream(file2); 
      graphicCropped = new DefaultStreamedContent(input); 
      showImageFinal = true; 
     } 

    } catch(Exception e){ 
     e.printStackTrace(); 
    } 

    return graphicCropped; 
} 

Wenn ich input.close(); dann tun, ich bin in der Lage, die Datei zu löschen, aber es wird nicht angezeigt, weil ich weiß, dass diese Getter mehr als einmal aufgerufen wird auf den Lebenszyklus.

Antwort

0

Ich habe es gelöst durch die vorgeschlagene Getter eines StreamedContent mit:

public StreamedContent getGraphicCropped() throws FileNotFoundException { 

    FacesContext context = FacesContext.getCurrentInstance(); 

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
     // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL. 
     return new DefaultStreamedContent(); 
    } 
    else { 
     // So, browser is requesting the image. Return a real StreamedContent with the image bytes. 
     File file2 = new File(pathCroppedImage); 
     InputStream input = new FileInputStream(file2); 
     showImageFinal = true; 
     return new DefaultStreamedContent(input); 
    } 
} 
Verwandte Themen