StreamingContent的<p:graphicimage>生成<img src="RES_NOT_FOUND"/> </p:graphicimage>

时间:2015-03-01 22:20:40

标签: jsf primefaces

我在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">

1 个答案:

答案 0 :(得分:0)

这种方法存在一些问题。这些归结为错误的假设,即上传的文件InputStreamStreamedContent可以多次读取和重复使用。这是不正确的。上传的文件只发送一次,流只能读取一次。而且,将特定于PrimeFaces的StreamedContent作为bean属性是错误的。 bean属性至少应为Filebyte[]Long(PK)。

您应该将上传的文件内容尽快写入永久存储位置 。在服务器的本地磁盘文件系统中为File,或在Long ID引用的数据库blob中,或者在服务器内存中为byte[]。然后,转而携带该永久存储位置的唯一标识符以识别文件内容。

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