Fil*_*erg 8 jsf richfaces facelets java-ee
我目前正在寻找使用Java Server Faces上传的文件.我发现使用RichFaces对它进行了很好的介绍.但是,我在这里理解这个过程有些麻烦.
首先,用户选择一个文件,如果立即上传设置为true,则使用ajax处理文件,到目前为止一直很好.然而,当谈到下一步时,Bean端的监听器会让我困惑:
public void listener(UploadEvent event) throws Exception{
UploadItem item = event.getUploadItem();
File f = item.getFile();
System.out.println(f.getAbsolutePath());
}
Run Code Online (Sandbox Code Playgroud)
绝对路径是我计算机上的临时目录,确定我理解,但是如何使该文件可用于webbapplication?我的应用程序部署为WAR文件.是否可以将其上传到WAR?可能听起来很愚蠢,但它实际上可能很方便.
我完全知道我可以重命名该文件以将其复制到新位置,但这是要走的路吗?
将内容写入WAR目录(假设WAR甚至被分解为目录)通常是一个坏主意(出于同样的原因,将数据存储在应用程序目录中通常是个坏主意).
您可能希望它最终存在于持久性存储中,通常是数据库.究竟如何管理由您决定 - 无论您是使用文件系统还是在数据库中存储引用,还是直接在数据库中存储BLOB以及是否使用JDBC或JPA或Hibernate等.
然后,可以通过使用类似的东西刷新包含它们的面板,从数据库中读取上载文件的列表<a4j:support event="onuploadcomplete" reRender="info" />.
文件下载servlet(如果RichFaces没有)很容易编写.
小智 5
不知道这有多少帮助(可能太晚了!),但这是我在服务器端使用的代码,相当于你的监听器.
public String uploadFile(UploadEvent event) {
UploadItem item = event.getUploadItem();
String name = "unnamed_attachment";
byte[] data = item.getData();
try {
name = FilenameUtils.getName(item.getFileName());
data = FileUtils.readFileToByteArray(item.getFile());
logger.info("data.length = " + data.length);
UploadDetails details = new UploadDetails(); // This is a javabean that gets persisted to database (actually a ejb3 entity bean, but thats irrelevant)
details.setBytes(data);
details.setResume(true);
// Save to database here
} catch (Exception e) {
FaceletsUtil.addSystemErrorMessage();
logger.error(e, e);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
剩下的最大问题是你说"你如何将文件提供给webbapplication?".字节数组立即可用.如果要重新下载该文件,可以将其作为JSF会话/视图bean中方法的链接提供,如:
<h:commandButton action="#{Manager.downloadFile}" value="Download report"> </h:commandButton>
public void downloadFile() {
final HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.setHeader("Content-Disposition", "attachment;filename=radar-report" + new Date() + ".pdf"); // or whatever type you're sending back
try {
response.getOutputStream().write(uploadDetails.getBytes()); // from the UploadDetails bean
response.setContentLength(uploadDetails.getBytes().length);
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (IOException e) {
logger.error(e, e);
}
FacesContext.getCurrentInstance().responseComplete();
}
Run Code Online (Sandbox Code Playgroud)