1

我读了很多页,但我敢肯定,我在某处犯了一些错误,我不能像它应该的那样简单地上传文件。

首先,我在带有 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 放入 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 标记中,则应用程序没有调用该方法!有人能帮我吗?非常感谢!

4

2 回答 2

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>配置FacesServlet完全相同web.xml

  • Commons IO 和 FileUpload JAR 不在 webapp 的运行时类路径中。我不使用 Netbeans,因此无法详细说明,但无论您使用哪种方式将 JAR 包含在 webapp 中,您都需要绝对确保它们最终位于/WEB-INF/lib已部署的 webapp 的文件夹中。您可以通过检查服务器中的部署来验证这一点。在 Eclipse 中,这可以通过直接将这些 JAR 直接放入 Web 项目的那个文件夹中来实现。

  • 您的 Web 应用程序中碰巧有另一个Filter,它与 PrimeFaces 文件上传过滤器的工作大致相同,并且在 PrimeFaces 文件上传过滤器之前执行。例如,ExtensionsFilter捆绑在 Tomahawk 中的 MyFaces。请求正文只能被解析一次。

于 2012-04-18T13:11:00.430 回答
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
        ..}
于 2013-11-04T23:45:36.050 回答