我在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>
我的后端豆:
public class WizzardBean extends BaseBean {
private List<HotelImage> hotelImages;
public void handleFileUpload(FileUploadEvent event) throws IOException {
if (event.getFile() != null) {
HotelImage hotelImage = new HotelImage(hotelImages.size(), event.getFile().getFileName(), event.getFile());
hotelImages.add(hotelImage);
}
}
public StreamedContent getHotelImage() {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
String photoId = externalContext.getRequestParameterMap().get("imgId");
if (photoId == null || photoId.equals("")) {
return null;
} else {
int parsedId = Integer.parseInt(photoId);
return hotelImages.get(parsedId).getImage();
}
}
}
HotelImage类:
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">
答案 0 :(得分:0)
这种方法存在一些问题。这些归结为错误的假设,即上传的文件InputStream
和StreamedContent
可以多次读取和重复使用。这是不正确的。上传的文件只发送一次,流只能读取一次。而且,将特定于PrimeFaces的StreamedContent
作为bean属性是错误的。 bean属性至少应为File
或byte[]
或Long
(PK)。
您应该将上传的文件内容尽快写入永久存储位置 。在服务器的本地磁盘文件系统中为File
,或在Long
ID引用的数据库blob中,或者在服务器内存中为byte[]
。然后,转而携带该永久存储位置的唯一标识符以识别文件内容。
您可以在下面链接的问题的答案中找到具体而精细的例子。