Jsf 预览期间找不到基于上载文件创建的StreamedContent

Jsf 预览期间找不到基于上载文件创建的StreamedContent,jsf,file-upload,primefaces,Jsf,File Upload,Primefaces,我在jsf页面上创建了一个文件上传对话框和一个图像库。每次上传图像后,画廊应显示迄今为止上传的所有图像。图像将存储在后端bean中,并且应由库从后端bean动态获取。由于某些原因,库显示上载的图像标签,但不显示引用图像,因为找不到图像资源 我在tomcat上使用spring、primefaces。提前谢谢你的帮助 我的JSF页面: <p:fileUpload id="imageUpldoad" update="galleryPanel" fileUploadListener="#{wizz

我在jsf页面上创建了一个文件上传对话框和一个图像库。每次上传图像后,画廊应显示迄今为止上传的所有图像。图像将存储在后端bean中,并且应由库从后端bean动态获取。由于某些原因,库显示上载的图像标签,但不显示引用图像,因为找不到图像资源

我在tomcat上使用spring、primefaces。提前谢谢你的帮助

我的JSF页面:

<p:fileUpload id="imageUpldoad" update="galleryPanel" fileUploadListener="#{wizzardBean.handleFileUpload}" mode="advanced" dragDropSupport="true" 
              sizeLimit="10000000"  multiple="true" auto="false" fileLimit="100" allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />


<p:panel id="galleryPanel">
   <p:galleria id="gallery" value="#{wizzardBean.getHotelImages()}" var="img" panelWidth="500" panelHeight="313" showCaption="true" rendered="#{wizzardBean.showGallery()}">
        <p:graphicImage name="#{img.name}" value="#{wizzardBean.hotelImage}" alt="Image Description for #{img.name}" title="#{img}">
            <f:param id="imgId" name="imgId" value="#{img.id}" />
        </p:graphicImage>
</p:galleria>
浏览器显示:

<img id="mainFormId:j_idt52:j_idt55" src="RES_NOT_FOUND" alt="Image Description for twitter.png" title="twitter.png">

这种方法有几个问题。这些都归结为错误的假设,即上载的文件、
InputStream
StreamedContent
可以多次读取和重用。这是不正确的。上传的文件将只发送一次,并且在原始请求期间仅可用,并且流在创建后只能读取一次

此外,将PrimeFaces特定的
StreamedContent
甚至
UploadedFile
作为bean属性是错误的。bean属性至少应该是一个
文件
引用服务器本地磁盘文件系统上的物理文件,或者是一个
字节[]
表示服务器内存中的原始内容,或者是一个
表示数据库中blob项的插入ID

您需要调整代码,以便尽快将上载的文件内容保存到永久存储位置,然后将结果分配为类型为
file
byte[]
Long
的bean属性。然后,让代码的其余部分使用该bean属性在getter方法中创建一个
StreamedContent
。绝对不要将该
StreamedContent
分配给另一个bean属性

你可以在下面链接的问题的答案中找到具体而详细的例子


谢谢您的回答。我检查了您发送给我的第一个链接,但您在其中表示可以从流中获取图像(而不是在硬盘上有一个静态文件)……或者您的意思是多次读取同一流是无效的,我最好从文件(或其他pysical资源)中读取并为每个http请求创建一个单独的输入流?如回答中所述,问题确实是“多次”部分。
InputStream
只能读取一次。那就是EOF。
read()
方法将继续返回
-1
。没有什么能改变这一点。你只需要创建一个新的。很明显,只有当它永久性地存储在某个地方时,这才有可能。
public class HotelImage {

private int id;
private String name;
private StreamedContent image;

public HotelImage(int id, String name, UploadedFile file) {
    this.id = id;
    this.name = name;
    try {
        image = new DefaultStreamedContent(file.getInputstream(), "image/jpg");
    } catch (IOException e) {
    }
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

public StreamedContent getImage() {
    return image;
}
<img id="mainFormId:j_idt52:j_idt55" src="RES_NOT_FOUND" alt="Image Description for twitter.png" title="twitter.png">