Ho un bean con ambito vista in cui creo una persona. Una persona può avere una foto. Questa immagine viene caricata nella stessa pagina in cui viene creata la persona. L'immagine non è memorizzata in un database o su disco (poiché la persona non è ancora stata creata). Il bean deve essere considerato con scope poiché una persona può essere creata altrove e utilizza lo stesso bean. Se il bean è a livello di sessione e un utente carica un'immagine ma non salva la persona, l'immagine verrà visualizzata al prossimo tentativo dell'utente di creare una persona.Visualizza immagine caricata in JSF
Ho risolto questo utilizzando due fagioli; un bean con scope vista per creare la persona e un bean con scope di sessione per caricare l'immagine e ottenere l'immagine come stream. Ciò tuttavia causa il problema annotato sopra.
Come posso risolvere questo in un modo migliore?
Il caricamento di fagioli:
@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();
}
}
Il Create-a-persona di fagioli:
@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;
}
}
La parte relativa pagina JSF:
<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>
E 'interessante, che lei ha chiesto un esempio nel JSF e si è conclusa con un po' "JavaScript/jQuery magica". Anche il tuo commento all'altra risposta è più che necassario, perché l'esempio di lui è abbastanza carino. Ci sono molti modi JSF per svolgere bene il tuo compito - e non c'è bisogno di includere JS qui. Puoi per favore modificare la tua domanda o risposta? Le domande e le risposte non vanno d'accordo. – alexander
La risposta ha risolto il problema che avevo, quindi come si adattano? Vorrei anche precisare che la domanda è datata 16 luglio 2012, ovvero più di due anni fa. Posso tranquillamente dire che questa domanda è irrilevante per me. Se c'è qualcosa di sbagliato nella mia risposta, puoi modificarlo. ;-) – siebz0r