Hochgeladenes Bild in JSF anzeigen

Ich habe einen Blick Bean, wo ich eine Person erstellen. Eine Person kann ein Bild haben. Dieses Bild wird auf die Seite hochgeladen, auf der die Person erstellt wurde. Das Bild wird nicht in einer Datenbank oder auf einer Festplatte gespeichert (da die Person noch nicht erstellt wurde). Die Bean muss einen Gültigkeitsbereich haben, da eine Person an einer anderen Stelle erstellt werden kann und diese dieselbe Bean verwendet. Wenn die Bean einen Sitzungsbereich hat und ein Benutzer ein Bild hochlädt, die Person jedoch nicht speichert, wird das Bild angezeigt, wenn der Benutzer das nächste Mal versucht, eine Person zu erstellen.

Ich habe das mit zwei Bohnen gelöst. Eine View-Scoped-Bean zum Erstellen der Person und eine Session-Scoped-Bean zum Hochladen des Bildes und zum Abrufen des Bildes als Stream. Dies verursacht jedoch das oben erwähnte Problem.

Wie kann ich das besser lösen?

Die Upload-Bean:

@ManagedBean(name = "uploadBean")
@SessionScoped
public class UploadBean
{
    private UploadedFile    uploadedFile;

    public UploadedFile getUploadedFile()
    {
        return uploadedFile;
    }

    public StreamedContent getUploadedFileAsStream()
    {
        if (uploadedFile != null)
        {
            return new DefaultStreamedContent(new ByteArrayInputStream(uploadedFile.getContents()));
        }
        return null;
    }

    public void uploadFile(FileUploadEvent event)
    {
        uploadedFile = event.getFile();
    }
}

Die Create-a-Person-Bohne:

@ManagedBean(name = "personBean")
@ViewScoped
public class PersonBean
{
    private Person newPerson = new Person();

    public Person getNewPerson()
    {
        return newPerson;
    }

    private UploadedFile getUploadedPicture()
    {
        FacesContext context = FacesContext.getCurrentInstance();
        ELContext elContext = context.getELContext();
        UploadBean uploadBean = (UploadBean) elContext.getELResolver().getValue(elContext, null, "uploadBean");
        return uploadBean.getUploadedFile();
    }

    public void createPerson()
    {
        UploadedFile uploadedPicture = getUploadedPicture();
        // Create person with picture;
    }
}

Der relevante JSF-Seitenteil:

<h:form enctype="multipart/form-data">
    <p:outputPanel layout="block" id="personPicture">
        <p:graphicImage height="150"
            value="#{uploadBean.uploadedFileAsStream}"
            rendered="#{uploadBean.uploadedFileAsStream != null}" />
    </p:outputPanel>
        <p:fileUpload auto="true" allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
            fileUploadListener="#{uploadBean.uploadedFile}"
            update="personPicture" />
    <p:commandButton value="Save" actionListener="#{personBean.createPerson()}"/>
</h:form>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage