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?
hilft das, http://stackoverflow.com/a/9674671/617373? – Daniel
Es scheint der richtige Weg zu sein, aber irgendwie funktioniert es nicht! Ich habe meine glassfih-web.xml zum ersten Post hinzugefügt. – StepTNT