无法使用h:graphicImage JSF 2.0显示图像

时间:2014-07-12 22:03:00

标签: java eclipse jsf jsf-2

我写了一个从网络摄像头拍摄照片的bean。我想在JSF 2.0页面中显示这些图像,并且每隔n秒更新一次。

如果我在eclipse中给出路径名这样的文件就可以了:

public String getNewPhoto() {
        try {
            File dir = new File("C:/Users/User/MyApp/images/");
            FileUtils.cleanDirectory(dir);
        }catch(Exception ex) {
            ex.printStackTrace();
        }

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());

    try {
        webcam = Webcam.getDefault();
        webcam.open();
        ImageIO.write(webcam.getImage(), "PNG", new File("C:/Users/User/MyApp/images/"+ timeStamp + ".png"));
        webcam.close();
    }catch(Exception ex) {
        ex.printStackTrace();
    }

    return "C:/Users/User/MyApp/images/" + timeStamp + ".png"; 

}

使用以下XHTML:

      <p:graphicImage value="#{myBean.newPhoto}" id="photo" cache="false" />
      <p:poll interval="1" listener="#{myBean.increment}" update="photo" />

正如所期望的,以上所有的工作都可以在我的开发环境中完成eclipse。我想将它部署到我的服务器(Linux)。当我将路径从您上面看到的路径更改为

的/ var / lib中/ tomcat7 / web应用/ MyApp的/图像

然后保存图像,但我无法在h:graphicImage中显示它们。我也试过传递:

http://hostname:8080/MyApp/images/....

到h:graphicImage并且仍然没有骰子,我确信我错过了一些非常简单的东西。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

您还需要在图像保存行中更改它。 。 。

ImageIO.write(webcam.getImage(), "PNG", new File("C:/Users/User/MyApp/images/"+ timeStamp + ".png"));

答案 1 :(得分:0)

以下内容如何:

查看

<p:graphicImage value="#{photoBean.newPhoto}" id="photo" cache="false" />
<p:poll listener="#{photoBean.updatePhoto}" interval="1"
    update="photo" />

托管Bean

@ManagedBean
@RequestScoped
public class PhotoBean {

    private String realPath;
    private String realtivePath;

    @PostConstruct
    public void init() {
        realtivePath = "/images/webcam.png";
        ExternalContext externalContext = FacesContext.getCurrentInstance()
                .getExternalContext();
        realPath = externalContext.getRealPath(realtivePath);
    }

    public void updatePhoto() {
        try {

            File file = new File(realPath);
            file.delete(); // cleanup
            // Use file object to write image...

        } catch (IOException e) {
            // Implement some exception handling here
            e.printStackTrace();
        }
    }

    public String getNewPhoto() {
        return realtivePath;
    }
}

更多笔记(吸气剂)

在getter(getNewPhoto)中处理网络摄像头图像不是一个好主意,因为JSF可能会多次调用getter。

请参阅:Why JSF calls getters multiple times

<强>时间戳

我已从文件名中删除了时间戳。我认为您已添加它以防止浏览器缓存。这不是必需的,因为cache=false已经创建了唯一的图像URI。