使用Primefaces上传文件系统上的文件

时间:2012-04-18 11:10:51

标签: java file-upload jsf-2 primefaces

我读了很多页但是,我确定,我在某个地方做了一些错误而且我不能按照应该的那样上传文件。

首先,我正在使用Netbeans 7和JDK 1.7在Glassfish 3.1上使用JSF2.0,Primefaces 3.2和JPA2进行开发。

接下来我要说的是,我要将这个代码插入到一个接口中,该接口将从许多其他类扩展,并且应该将文件存储在文件系统的许多文件夹中! 所以现在我将报告我写的内容,请告诉我问题出在哪里!

这是web.xml中的代码:

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    <init-param>
        <param-name>uploadDirectory</param-name>
        <param-value>D:/Cyborg/</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>  

包含p:uploadFile的页面还包含许多其他表单的字段,我只会复制我认为您感兴趣的内容:

...
<h:form method="POST">
    ...
    <h:outputLabel for="uploadFile" value="#{bundle.LabelUploadFile}" />
    <p:fileUpload value="#{progettiController.uploadFile}" mode="simple" />
    ...
    <h:commandLink action="#{progettiController.create}" value="#{bundle.SaveLink}" />
    ...

这是名为AbstractController的接口代码:

protected UploadedFile uploadFile;

public void setUploadFile(UploadedFile uploadFile) {
    this.uploadFile=uploadFile;
}

public UploadedFile getUploadFile() {
    return uploadFile;
}

最后是方法Create into ProgettiController:

public String create() {
    try {
        getFacade().create(current);
        System.out.println("Message: ProgettiController: Create: new row created successfully!");

        try {
            current=getFacade().findLast();
            String ext=uploadFile.getFileName();
            System.out.println("Message: ProgettiController: Create: FileName="+ext);

            ext=ext.substring(ext.lastIndexOf("."),ext.length());
            System.out.println("Messaggio: ProgettiController: ext="+ext);

            current.setNomeFile(ext.substring(0,ext.lastIndexOf(".")));
            current.setTipoFile(ext.substring(ext.lastIndexOf(".")+1,ext.length()));
            getFacade().edit(current);
            ext=urlFilesystem+current.getId()+ext.substring(ext.lastIndexOf(".")+1,ext.length());
            System.out.println("Message: ProgettiController: Create: posizione e nome del file="+ext);

            File oldFile= (File)uploadFile;
            File newFile= new File(ext);
            oldFile.renameTo(newFile);
        } catch (Exception e) {
            System.out.println("Messaggio: ProgettiController: Create: errore nel try legato al upload="+e.getMessage());
            e.printStackTrace();
        }

        JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ProgettiCreated"));
        recreateModel();
        System.out.println("Messaggio: ProgettiController: create try");
        return url+"List?faces-redirect=true";
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        System.out.println("Messaggio: ProgettiController: create catch="+e.getMessage());
        e.printStackTrace();
        return url+"List?faces-redirect=true";
    }
}

如果我尝试这段代码,问题是当页面调用时方法返回null到uploadFile,如果我将“enctype =”multipart / form-data“”添加到h:form标签中,应用程序没有调用方法! 有人能帮我吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

  

如果我将“enctype =”multipart / form-data“”添加到h:form标签中,则应用程序不会调用该方法!

这意味着PrimeFaces文件上传过滤器无法正常工作。它负责解析multipart/form-data请求并以可理解的形式将解析后的数据提供给JSF(直到即将推出的JSF 2.2版本,JSF默认不支持multipart/form-data请求)。

至少可以有以下主要原因:

  • <servlet-name>中的<filter-mapping>不正确。您需要确保它与同一<servlet-name><servlet>的{​​{1}}配置完全相同FacesServlet

  • Commons IO和FileUpload JAR不在webapp的运行时类路径中。我不使用Netbeans,所以我不能详细介绍,但无论你使用什么方式将JAR包含在webapp中,你都需要确保它们最终位于部署的webapp的web.xml文件夹中。您可以通过检查服务器中的部署来验证这一点。在Eclipse中,可以通过直接将这些JAR直接放在Web项目的文件夹中来实现。

  • 您的网络应用程序中恰好有另一个/WEB-INF/lib与PrimeFaces文件上传过滤器的工作大致相同,并且在 PrimeFaces文件上传过滤器之前执行。例如,捆绑在战斧中的MyFaces Filter。请求体只能被解析一次。

答案 1 :(得分:1)

代码中出现错误导致空指针

        {..
        ext=ext.substring(ext.lastIndexOf("."),ext.length()); 
        // here ext contains the extension of the file only

        System.out.println("Messaggio: ProgettiController: ext="+ext);

        current.setNomeFile(ext.substring(0,ext.lastIndexOf(".")));
        // used the extension as the file name
        current.setTipoFile(ext.substring(ext.lastIndexOf(".")+1,ext.length()));
        // the file type is an empty string causing the error
        ..}

尝试以下

        {..
        ext=ext.substring(ext.lastIndexOf("."),ext.length()); 

        System.out.println("Messaggio: ProgettiController: ext="+ext);

       current.setNomeFile(uploadFile.getFileName().
                           substring(0,uploadFile.getFileName().lastIndexOf(".")));
        // the file name is setted properly
        current.setTipoFile(uploadFile.getFileName().
                           substring(uploadFile.getFileName().
                           lastIndexOf(".")+1,uploadFile.getFileName().length()));
        // the file type is setted properly
        ..}