2012-03-23 15 views
0

Ich versuche, das Beispiel https://www.primefaces.org/showcase/ui/multimedia/photoCam.xhtml mit einer einfachen Variante zu replizieren.PrimeFaces 'Photocam: Zeige aufgenommenes Bild

In diesem Beispiel wird jedes Bild gespeichert und angezeigt.

Aber ich muss nur die neueste anzeigen, also habe ich die Listenreferenzen entfernt und den Code ein wenig bearbeitet.

Also verwende ich nur die GrafikImage anstelle der ImageSwitch, und in der onCapture Methode überschreibe ich einfach das vorherige Bild.

Aber hier ist das Problem.

Das neue Bild ist korrekt aufgenommen, ich kann es sehen, indem ich zu seinem Ordner blättere, aber es wird nicht auf der Seite aktualisiert. Es scheint, dass es immer noch die vorherige zwischengespeicherte zeigt, weil es funktioniert, wenn es die erste ist (keine Datei davor).

Irgendwelche Vorschläge?

EDIT: Hier einige Code.

PrimeFaces JSF

<h:form> 

<h:panelGrid columns="3"> 
    <p:photoCam widgetVar="pc" listener="#{photoCamBean.oncapture}" update="photos"/> 

    <p:commandButton type="button" value="Capture" onclick="pc.capture()"/> 

    <p:imageSwitch effect="zoom" id="photos"> 
     <ui:repeat value="#{photoCamBean.photos}" var="photo"> 
      <p:graphicImage value="/photocam/#{photo}.png" /> 
     </ui:repeat> 
    </p:imageSwitch> 
</h:panelGrid> 

MY JSF

<p:photoCam widgetVar="pc" listener="#{registerBean2.onCapture}" update="photo"/> 
    <p:commandButton type="button" value="Capture" onclick="pc.capture()" update="photoPanel"/> 
    <p:panel id="photoPanel"> 
     <p:graphicImage value="./uploaded/temp/#{registerBean2.utente.username}.png" id="photo"> 
      <p:effect type="pulsate" event="load" delay="500"> 
       <f:param name="mode" value="'show'" /> 
      </p:effect> 
     </p:graphicImage> 
    </p:panel> 

PRIMEFACES BEAN

public void oncapture(CaptureEvent captureEvent) { 
    String photo = getRandomImageName(); 
    this.photos.add(0,photo); 
    byte[] data = captureEvent.getData(); 

    ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext(); 
    String newFileName = servletContext.getRealPath("") + File.separator + "photocam" + File.separator + photo + ".png"; 

    FileImageOutputStream imageOutput; 
    try { 
     imageOutput = new FileImageOutputStream(new File(newFileName)); 
     imageOutput.write(data, 0, data.length); 
     imageOutput.close(); 
    } 
    catch(Exception e) { 
     throw new FacesException("Error in writing captured image."); 
    } 
} 

MY BEAN

public void onCapture(CaptureEvent captureEvent) { 
    makeAvatar(captureEvent.getData()); 
} 

private void makeAvatar(byte[] imageData) { 
    FileImageOutputStream imageOutput; 
    ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext(); 
    File imageFile = new File(extContext.getRealPath("NEW//uploaded//temp") + "//" + utente.getUsername() + ".png"); 
    try { 
     if (imageFile.exists()) { 
      imageFile.delete(); 
     } 
     imageFile.createNewFile(); 
     imageOutput = new FileImageOutputStream(imageFile); 
     imageOutput.write(imageData, 0, imageData.length); 
     imageOutput.close(); 
     FacesMessage msg = new FacesMessage("Immagine caricata correttamente."); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } catch (Exception e) { 
     FacesMessage msg = new FacesMessage("Errore nel caricamento dell'immagine!"); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } 
} 

Das Bild wird erfasst und in meinem Temp Ordner aktualisiert, aber es wird nicht auf der Seite ändern. Selbst eine Aktualisierung wird mir nicht helfen. Es ändert sich nur nach einem Serverneustart!

EDIT: Hier ist meine Glassfish-web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> 
<glassfish-web-app error-url=""> 
    <class-loader delegate="true"/> 
    <jsp-config> 
     <property name="keepgenerated" value="true"> 
      <description>Keep a copy of the generated servlet class' java code.</description> 
     </property> 
     <property name="alternatedocroot_1" value="from=/uploads/* dir=/home/stefano/Documenti/UniLife" /> 
    </jsp-config> 
</glassfish-web-app> 

Daniels Lösung verwenden, sollte ich der Lage gewesen, localhost zu durchsuchen: 8080/Unilife5-Krieg/uploads/Avatar/cp99.png zu zeigen /home/stefano/Documenti/UniLife/avatar/cp99.png, oder ich liege falsch?

+1

hilft das, http://stackoverflow.com/a/9674671/617373? – Daniel

+0

Es scheint der richtige Weg zu sein, aber irgendwie funktioniert es nicht! Ich habe meine glassfih-web.xml zum ersten Post hinzugefügt. – StepTNT

Antwort

0

Nicht vertraut mit Glasfischen zu gut ... aber für den Anfang würde ich das einfachste Beispiel durch BalusC

gegeben verwenden PrimeFace update after upload

<property name="alternatedocroot_1" value="from=/uploads/* dir=/var/webapp" /> 

And use http://localhost:8080/contextname/uploads/* to serve those uploaded images from by 

<h:graphicImage> the usual way. 

Ohne andere innere Ordner wie

stefano/Documenti/UniLife/avatar/

Und hast du deinen Bean-Code geändert?

File imageFile = new File(extContext.getRealPath("NEW//uploaded//temp") + "//" + utente.getUsername() + ".png"); 
+0

Danke nochmal, aber http: // localhost: 8080/contextname/uploads/gibt mir einen 404 Fehler. Ich nehme an, dass _contextname_ ein Parameter ist, aber ich habe alle Kombinationen ausprobiert, ohne erfolgreich zu sein. Ich schließe diese Frage und ich werde eine neue öffnen, weil das Thema geändert wird! – StepTNT

+0

ich dachte, dass contextname bedeutete Ihren Web-App-Namen localhost: 8080/yourWebAppName/uploads, nicht wahr? – Daniel

+0

Das dachte ich auch, aber es funktioniert nicht .. Ich habe eine Datei f.txt in/var/webapp und http: // localhost: 8080/Unilife5-war/uploads/f.txt zeigt eine 404 Error ! – StepTNT

Verwandte Themen