Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 使用p:graphicImage和StreamedContent显示来自数据库或远程源的动态图像_Database_Image_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Database 使用p:graphicImage和StreamedContent显示来自数据库或远程源的动态图像

Database 使用p:graphicImage和StreamedContent显示来自数据库或远程源的动态图像,database,image,jsf,jsf-2,primefaces,Database,Image,Jsf,Jsf 2,Primefaces,我试图在中以StreamedContent的形式显示保存在数据库中的图像字节,如下所示: 私有流内容内容;//接二连三 公共流内容getImageF(){ if(student.getImage()!=null){ InputStream is=newbytearrayinputstream(student.getImage()); System.out.println(“字节:+student.getImage()); content=newdefaultstreamedcontent(是

我试图在
中以
StreamedContent
的形式显示保存在数据库中的图像字节,如下所示:


私有流内容内容;//接二连三
公共流内容getImageF(){
if(student.getImage()!=null){
InputStream is=newbytearrayinputstream(student.getImage());
System.out.println(“字节:+student.getImage());
content=newdefaultstreamedcontent(是,“,student.getStuID());
System.out.println(“ddd----------------------”+内容);
返回内容;
}
返回内容;
}
这将返回一个空白图像。这是如何造成的,我如何解决

标准输出打印以下内容:

INFO: Byte :[B@a2fb48
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@b0887b
INFO: Byte :[B@a2fb48
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1d06a92
INFO: Byte :[B@d52f0b
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@39a60
INFO: Byte :[B@d52f0b
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@8c3daa
INFO: Byte :[B@124728a
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1dbe05b
INFO: Byte :[B@124728a
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@66a266
INFO: Byte :[B@a2fb48
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1293976
INFO: Byte :[B@a2fb48
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@17b7399
INFO: Byte :[B@d52f0b
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1e245a5
INFO: Byte :[B@d52f0b
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@4a7153
INFO: Byte :[B@124728a
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@1561bfd
INFO: Byte :[B@124728a
INFO: ddd ------------------------------- org.primefaces.model.DefaultStreamedContent@47a8c2

这里有几个可能性(如果不是这样,请发布整个课程)

1) 您没有正确初始化映像 2) 你的流是空的,所以你什么也得不到

我假设student.getImage()有一个字节[]的签名,所以首先确保该数据实际上是完整的,并且表示一个图像。第二,您没有指定一个应该是“image/jpg”或您正在使用的任何内容类型

这里有一些样板代码可供检查,我使用Primefaces 2来实现这一点

/** 'test' package with 'test/test.png' on the path */
@RequestScoped
@ManagedBean(name="imageBean")
public class ImageBean
{
    private DefaultStreamedContent content;

    public StreamedContent getContent()
    {
        if(content == null)
        {
            /* use your database call here */
            BufferedInputStream in = new BufferedInputStream(ImageBean.class.getClassLoader().getResourceAsStream("test/test.png"));
            ByteArrayOutputStream out = new ByteArrayOutputStream();

            int val = -1;
            /* this is a simple test method to double check values from the stream */
            try
            {
                while((val = in.read()) != -1)
                    out.write(val);
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }

            byte[] bytes = out.toByteArray();
            System.out.println("Bytes -> " + bytes.length);
            content = new DefaultStreamedContent(new ByteArrayInputStream(bytes), "image/png", "test.png");
        }

        return content;
    }
}
还有一些标记

<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.prime.com.tr/ui"
>

    <h:head>

    </h:head>

    <h:body>
        <p:graphicImage value="#{imageBean.content}" />
    </h:body>
</html>

如果该代码有效,那么您的设置就正确了。尽管它是流的垃圾代码(不要在生产中使用),但它应该为您提供一个故障排除点。我的猜测是,您可能在JPA或其他数据库框架中发生了某些事情,其中字节[]为空或格式错误。或者,您可能会遇到内容类型问题

最后,我将从bean中克隆数据,这样student.getImage()只会被复制到一个新数组中,然后使用。这样,如果您有一些未知的事情(移动对象或更改字节[]的其他事情),您就不会弄乱您的流

做一些类似于:

byte[] data = new byte[student.getImage().length]
for(int i = 0; i < data.length; i++)
  data[i] = student.getImage()[i];
byte[]data=新字节[student.getImage().length]
对于(int i=0;i
这样你的bean就有了一个副本(或者Arrays.copy()——任何可以让你漂浮的东西)。我无法强调像这样简单的/content类型通常是错误的。祝你好运。

这个
需要一个特殊的getter方法。也就是说,每个生成的映像都会被调用两次,每次都在一个完全不同的HTTP请求中

第一个HTTP请求请求JSF页面的HTML结果,它将第一次调用getter以生成HTML
属性,该属性包含webbrowser将要请求图像时应该调用哪个bean和getter的信息ng>不需要返回图像的内容。它不会以任何方式使用,因为HTML不是这样工作的(图像在HTML输出中不是“内联”的,而是单独请求的)

一旦webbrowser以HTTP响应的形式检索HTML结果,它将解析HTML源代码,以便将结果可视化地呈现给最终用户。一旦webbrowser遇到
属性,以便下载该图像的内容并将其嵌入可视化呈现中。这将第二次调用getter方法ich反过来应该返回实际的图像内容

在您的特定情况下,PrimeFaces显然无法识别和调用getter来检索实际的图像内容,或者getter没有返回预期的图像内容
变量名和日志中的大量调用表明您在
中使用了它。最有可能的情况是,支持bean是请求范围的,并且数据模型在请求映像期间没有正确保存,JSF将无法在正确的迭代循环期间调用getter。视图范围的bean将d也不起作用,因为当浏览器实际请求图像时,JSF视图状态不可用


要解决这个问题,最好重写getter方法,这样就可以在每个请求的基础上调用它,其中您将唯一的映像标识符作为
传递,而不是依赖一些可能“不同步”的支持bean属性在随后的HTTP请求期间。为此使用一个独立的应用程序范围的托管bean是完全有意义的,它没有任何状态。此外,
InputStream
只能读取一次,不能多次

换句话说:永远不要将
StreamedContent
或任何
InputStream
甚至
UploadedFile
声明为bean属性;只有在webbrowser实际请求图像内容时,才在无状态
@ApplicationScoped
bean的getter中创建它

例如


其中,
studentimage
支持bean可以如下所示:

@Named//或@ManagedBean
@适用范围
公共课学生形象{
@EJB
私立学生服务;
公共流内容getImage()引发IOException{
FacesContext context=FacesContext.getCurrentInstance();
if(context.getCurrentPhaseId()==PhaseId.RENDER_响应){
//因此,我们正在呈现HTML。返回一个存根StreamedContent,以便它生成正确的URL。
返回新的DefaultStreamedContent();
}
否则{
//因此,浏览器正在请求图像。返回包含图像字节的真实StreamedContent。
字符串studentId=context.getExternalContext().getRequestParameterMap().get(“studentId”);
Student=studentService.find
String mimeType = "image/jpg";
StreamedContent file = new DefaultStreamedContent(bytes, mimeType, filename);  
context.getCurrentPhaseId().getName()
org.primefaces.application.resource.StreamedContentHandler () - Error in streaming dynamic resource. Error reading 'image' on type a.b.SomeBean