1

可能重复:
使用 p:graphicImage 显示数据库中的图像

我想从存储在数据库中的 url 显示一张照片,所以我使用如下

                <h:panelGrid columns="1">
                    <p:graphicImage value="#{userController.photo}"/> 
                </h:panelGrid>

photo 属性是一个指向照片位置的 url 字符串

public String getPhoto() {
   String path = new File("").getAbsolutePath();
   ph =ejbPhoto.find(current.getIdPhoto()); 
   System.out.println("+PHOTO +++++++++++++++"+path+"\\"+ph.getPhotoName()); 
   return path+"\\"+ph.getPhotoName();
}

system.out.println 显示图像的正确路径,但在显示页面中未显示照片,所以有什么想法吗?

4

3 回答 3

3

首先,new File("").getAbsolutePath()返回当前工作目录。即在发出命令启动服务器时打开的本地磁盘文件系统目录。保证每次启动服务器时该值都相同。这取决于服务器的启动方式。例如,在 IDE 中,或在命令控制台中,或通过服务等。

您绝对不应该让您的业务逻辑依赖于这种环境不一致。

其次,生成的 HTML<img src>必须指向 URL(HTTP 路径),而不是本地磁盘文件系统路径。即必须通过 URL 单独下载图像的网络浏览器http://example.com/contextname/images/foo.png(而不是必须自动将它们嵌入到 HTML 代码中的网络服务器)。您当前的代码方法仅在new File("")指向已部署 web 应用程序的公共 Web 内容文件夹时才有效,这是非常非常不可能的。

您应该确保这些<img src>指向一个有效的 HTTP URL,正是您可以在 webbrowser 的地址栏中复制粘贴的那个。


目前尚不清楚您为什么要这样设计它以及您的业务限制是什么,因此无法发布合适的答案如何正确解决它。所以这里有几个链接显示(轻微)解决这个问题的不同方法:

于 2012-10-03T20:38:20.057 回答
1

我的两分钱。使用图像 URL 可能会将您的目录结构暴露给任何有firebug或类似的人。因此,可能会发生许多不好的事情,如果我能提供帮助,我不喜欢使用与我的应用程序服务器的文件系统相关的文件路径。如果您的实现支持它,我建议您使用 primefaces 的DynaImage从数据库中提供图像

于 2012-10-04T04:12:06.720 回答
-1

解决方法很简单,照片的路径在netbeans项目的web文件夹下(Project\build\web\photo)

<h:panelGrid columns="1" width="50%" >
                    <p:graphicImage value="/photo/#{userController.photo}"/> 
  </h:panelGrid>

在照片获取方法中我放了:

public String getPhoto() {

   ph =ejbPhoto.find(current.getIdPhoto()); 
   if(ph==null) return "noPhoto.png";
   System.out.println(ph.getPhotoName()); 
   current=null;
    return ph.getPhotoName();
}

并且照片名称包含扩展名。

于 2012-10-03T22:09:47.453 回答