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

Posted

技术标签:

【中文标题】无法使用 h:graphicImage JSF 2.0 显示图像【英文标题】:Can't display image with h:graphicImage JSF 2.0 【发布时间】:2014-09-03 06:13:46 【问题描述】:

我编写了一个从网络摄像头拍摄照片的 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/webapps/MyApp/images

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我确实更改了保存图像的位置。以上只是我的开发环境中的示例代码,我已将您在上面看到的任何地方的路径更改为我的服务器的正确位置。【参考方案2】:

以下内容如何:

查看

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

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

见:Why JSF calls getters multiple times

时间戳

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

【讨论】:

以上是关于无法使用 h:graphicImage JSF 2.0 显示图像的主要内容,如果未能解决你的问题,请参考以下文章

h:graphicImage 通过 f:ajax 更新其值时不会下载

jsf 2.0 上的 JSF1064“无法找到或提供资源”警告

JSF 2.3 无法通过 Tomcat 9 支持 WebSocket

JSF 2.0 无法从 primefaces 呈现对话框

无法通过 JSF 2.2 中的 web.xml 解决 ViewExpiredException

JSF 2.0。无法在 preRenderView 事件处理程序中获取 POST 参数和 cookie