Jsf 预览期间找不到基于上载文件创建的StreamedContent
我在jsf页面上创建了一个文件上传对话框和一个图像库。每次上传图像后,画廊应显示迄今为止上传的所有图像。图像将存储在后端bean中,并且应由库从后端bean动态获取。由于某些原因,库显示上载的图像标签,但不显示引用图像,因为找不到图像资源 我在tomcat上使用spring、primefaces。提前谢谢你的帮助 我的JSF页面: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
<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属性
你可以在下面链接的问题的答案中找到具体而详细的例子
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">