我有一个视图范围的bean,我创建一个人。一个人可以有一张照片。这张照片上传到创建人的同一页面。图片没有存储在数据库或磁盘上(因为该人尚未创建)。该bean必须被视为作用域,因为可以在其他地方创建一个人,并使用相同的bean。如果bean是会话范围的,并且用户上传图片但不保存该人员,则该图片将在用户下次尝试创建人员时显示。在JSF中显示上传的图像
我使用两个bean解决了这个问题;一个视图范围的bean来创建人员和一个会话范围的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();
}
}
的创造,一个人的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;
}
}
相关的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>
有趣的是,您在JSF中请求了一个示例,并以“Javascript/JQuery魔术”结尾。另外,你对另一个答案的评论不仅仅是一种选择,因为他的例子非常好。有很多JSF方法可以很好地完成你的任务 - 并且不需要在这里包含JS。你能否编辑你的问题或答案?问题和答案不一致。 – alexander 2015-02-23 11:58:31
答案解决了我的问题,那么他们如何不合适?我还想指出,这个问题是在2012年7月16日,这是两年前。我可以放心地说,这个问题与我无关。如果我的答案有问题,可以编辑它。 ;-) – siebz0r 2015-02-23 12:51:38