Ich habe eine Sichtweite Bohne, wo ich eine Person erstellen. Eine Person kann ein Bild haben. Dieses Bild wird auf die gleiche 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 ein Sichtbereich sein, da eine Person an anderer Stelle erstellt werden kann und dieselbe Bean verwendet. Wenn die Bean für die Sitzung konfiguriert ist und ein Benutzer ein Bild hochlädt, aber die Person nicht speichert, wird das Bild beim nächsten Versuch des Benutzers, eine Person zu erstellen, angezeigt.Anzeige hochgeladenes Bild in JSF
Ich löste das mit zwei Bohnen; Eine Ansicht scoped Bean, um die Person zu erstellen, und eine Session-Bean, um das Bild hochzuladen und das Bild als Stream zu erhalten. Dies verursacht jedoch das oben erwähnte Problem.
Wie kann ich das besser lösen?
Die Upload-Bohne:
@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();
}
}
Der create-a-Person-Bean:
@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;
}
}
Die entsprechende JSF Seite Teil:
<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>
Es ist interessant, dass Sie nach einem Beispiel in JSF gefragt haben und Sie mit etwas "Javascript/JQuery Magie" beendet haben. Auch Ihr Kommentar zu der anderen Antwort ist mehr als notwendig, weil das Beispiel von ihm ziemlich nett ist. Es gibt viele JSF-Wege, um Ihre Aufgabe gut zu erledigen - und Sie müssen JS hier nicht hinzufügen. Können Sie Ihre Frage auch bearbeiten oder beantworten? Frage und Antwort passen nicht zusammen. – alexander
Die Antwort löste das Problem, das ich hatte, also wie passen sie nicht zusammen? Ich möchte auch sagen, dass die Frage auf den 16. Juli 2012 datiert ist, also vor mehr als zwei Jahren. Ich kann sicher sagen, dass diese Frage für mich irrelevant ist. Wenn etwas mit meiner Antwort nicht stimmt, können Sie sie bearbeiten. ;-) – siebz0r