Mam widok z określonymi komponentami, w których utworzę osobę. Osoba może mieć zdjęcie. To zdjęcie zostało przesłane na tę samą stronę, na której osoba została utworzona. Obraz nie jest przechowywany w bazie danych lub na dysku (ponieważ ta osoba nie jest jeszcze utworzona). Komponent bean musi mieć zasięg widoku, ponieważ dana osoba może zostać utworzona gdzie indziej, a ta używa tego samego komponentu bean. Jeśli komponent bean ma zasięg sesji, a użytkownik przesyła obraz, ale nie zapisuje osoby, zdjęcie zostanie wyświetlone następnym razem, gdy użytkownik spróbuje utworzyć osobę.Wyświetlenie przesłanego obrazu w JSF
Rozwiązałem to, używając dwóch ziaren; jeden widok z określonymi komponentami, aby utworzyć osobę i komponent o rozmiarze sesji, aby przesłać obraz i uzyskać obraz jako strumień. Powoduje to jednak problem opisany powyżej.
Jak mogę rozwiązać ten problem w lepszy sposób?
Wysyłanie fasola:
@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();
}
}
Fasola kreacji osobę:
@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;
}
}
Właściwa część stronę 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>
Ciekawe, że poprosiłeś o przykład w JSF i skończyłeś z "magią JavaScript/JQuery". Również twój komentarz do drugiej odpowiedzi jest więcej niż konieczny, ponieważ jego przykład jest całkiem niezły. Istnieje wiele sposobów JSF, które wykonują twoje zadanie całkiem dobrze i nie ma potrzeby dołączania JS tutaj. Czy możesz edytować swoje pytanie lub odpowiedź? Pytanie i odpowiedź nie pasują do siebie. – alexander
Odpowiedź rozwiązała problem, który miałem, więc jak one nie pasują do siebie? Chciałbym również powiedzieć, że pytanie pochodzi z 16 lipca 2012 roku, czyli ponad dwa lata temu. Mogę śmiało powiedzieć, że to pytanie jest dla mnie nieistotne. Jeśli coś jest nie tak z moją odpowiedzią, możesz ją edytować. ;-) – siebz0r