Фотокамера PrimeFaces: показ полученного изображения - PullRequest
0 голосов
/ 23 марта 2012

Я пытаюсь повторить пример https://www.primefaces.org/showcase/ui/multimedia/photoCam.xhtml с простым вариантом.

В этом примере каждый снятый снимок сохраняется и отображается.

Но мне просто нужно показать последнюю версию, поэтому я удалил ссылки на список и немного отредактировал код.

Так что я использую только graphicsImage вместо imageSwitch, а в методе onCapture я просто перезаписываю предыдущее изображение.

Но вот проблема.

Новое изображение получено правильно, я вижу его, просматривая его папку, но оно не будет обновляться на странице. Кажется, что он все еще показывает предыдущий кэшированный, потому что он работает, если это первый (нет файла до этого взять).

Есть предложения?

EDIT: Вот некоторый код.

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>  

МОЙ 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> 

ПРЕИМУЩЕСТВА БИНА

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.");  
    }  
}  

МОЯ БИНА

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);
    }
}

Изображение записывается и обновляется в моей папке temp , но оно не изменяется на странице. Даже обновление не поможет мне. Изменяется только после перезагрузки сервера!

РЕДАКТИРОВАТЬ: Вот мой 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>

Используя решение Дэниела, я смог бы найти localhost: 8080 / Unilife5-war / uploads / avatar / cp99.png , чтобы показать / home / stefano / Documenti / UniLife / avatar / cp99.png , или я ошибаюсь?

1 Ответ

0 голосов
/ 25 марта 2012

Не очень хорошо знаком с Glassfish ... но для начала я бы использовал простейший пример, приведенный BalusC

Обновление PrimeFace после загрузки

<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. 

Без других внутренних папок, таких как

stefano / Documenti / UniLife / avatar /

А вы изменили свой код бина?

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