我试图用一个简单的变体来复制https://www.primefaces.org/showcase/ui/multimedia/photoCam.xhtml的例子。
在示例中,每张拍摄的照片都会保存并显示出来。
但我只需要显示最新的一个,所以我删除了列表引用并稍微编辑了代码。
所以我只使用graphicsImage而不是imageSwitch,而在 onCapture 方法中我只是覆盖了上一张图片。
但这是问题所在。
正确拍摄新图像,我可以通过浏览到其文件夹来查看,但不会在页面中更新。 它似乎仍然显示了之前的缓存,因为如果它是第一个(在此之前没有文件)它可以工作。
有什么建议吗?
编辑: 这里有一些代码。
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);
}
}
在 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>
使用Daniel的解决方案,我应该可以浏览 localhost:8080 / Unilife5-war / uploads / avatar / cp99.png 来显示 / home / stefano / Documenti / UniLife /avatar/cp99.png ,或者我错了?
答案 0 :(得分:0)
不熟悉玻璃鱼......但是首先我会使用BalusC给出的最简单的例子
<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.
没有其他内部文件夹,如
斯特凡诺/文件/ UniLife /化身/
你有没有改变你的bean代码?
File imageFile = new File(extContext.getRealPath("NEW//uploaded//temp") + "//" + utente.getUsername() + ".png");