代码之家  ›  专栏  ›  技术社区  ›  Filip Ekberg

使用richfaces上载文件

  •  8
  • Filip Ekberg  · 技术社区  · 16 年前

    我目前正在寻找一些使用Java服务器的文件上传。我找到了 this great introduction 使用richfaces。然而,我在理解这个过程中遇到了一些困难。

    首先,用户选择一个文件,如果立即上载设置为true,那么文件将使用Ajax进行处理,目前为止效果良好。然而,当进入下一步时,bean端的侦听器会让我感到困惑:

    public void listener(UploadEvent event) throws Exception{
        UploadItem item = event.getUploadItem();
    
        File f = item.getFile();
    
        System.out.println(f.getAbsolutePath());
    }
    

    绝对路径是到我的计算机上的一个临时目录,当然我理解,但是您如何使该文件对webbapplication可用?我的应用程序部署为一个WAR文件。可以上传到战争中吗?听起来可能很愚蠢,但实际上可能很方便。

    我完全知道我可以重命名文件以将其复制到新的位置,但这是一种方法吗?

    2 回复  |  直到 15 年前
        1
  •  5
  •   McDowell rahul gupta    16 年前

    一般来说,将内容写入war目录(假设战争甚至被分解为一个目录)是一个坏主意(原因与将数据存储在应用程序目录中通常是一个坏主意相同)。

    您可能希望它最终出现在持久性存储中,通常是一个数据库。具体的管理方式取决于您——您是使用文件系统并在数据库中存储引用,还是直接在数据库中存储blob,以及您是使用JDBC、JPA还是Hibernate等。

    然后,可以通过刷新包含上载文件的面板,从数据库中读取上载文件的列表,方法如下: <a4j:support event="onuploadcomplete" reRender="info" /> .

    文件下载servlet(如果richfaces没有)非常容易编写。

        2
  •  5
  •   Greg    15 年前

    不确定这有多大帮助(可能太晚了!)但这是我在服务器端使用的代码,相当于您的侦听器。

    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;
    }
    

    剩下的一个大问题是,您会说“您将如何使该文件对WebApplication可用?”字节数组立即可用。如果要重新下载该文件,可以将其作为链接提供给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();
    }
    
    推荐文章