【问题标题】:Error while using Primefaces 3.5 File Upload使用 Primefaces 3.5 文件上传时出错
【发布时间】:2013-08-12 23:09:02
【问题描述】:

在使用 PrimeFaces 3.3 的项目中,文件上传功能正常。我删除了 Primefaces 3.3 并添加了 3.5。从那时起,我就无法进行文件上传功能了。之前我添加了 commons-io 和 commons.fileupload,我不确定它们是否仍然需要,所以我也保留了这些 jar 文件。

错误

java.lang.NullPointerException
    at org.primefaces.component.fileupload.FileUploadRenderer.decodeSimple(FileUploadRenderer.java:56)
    at org.primefaces.component.fileupload.FileUploadRenderer.decode(FileUploadRenderer.java:47)
    at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:836)
    at javax.faces.component.UIInput.decode(UIInput.java:771)
    at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1228)
    at javax.faces.component.UIInput.processDecodes(UIInput.java:676)
    at javax.faces.component.UIForm.processDecodes(UIForm.java:225)
    at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1223)
    at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1223)
    at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:929)
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:724)

支持豆

public void handleFileUpload1(FileUploadEvent event) { 
    System.out.println("uploading");
    FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");  
    FacesContext.getCurrentInstance().addMessage(null, msg);  
    System.out.println("uploaf finished");
} 

JSF 页面

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
        <h:outputStylesheet library="css" name="maincss.css" />
    </h:head>
    <h:body>

        <h:form enctype="multipart/form-data">
            <p:fileUpload  fileUploadListener="#{staffController.handleFileUpload1}" mode="simple" value="#{staffController.file}"
                           allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />  
            <p:commandButton ajax="false" value="Submit" />

        </h:form>


    </h:body>
</html>

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></param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping> 

【问题讨论】:

  • 您选择了文件吗?根据源代码,文件已上传,但文件名不知何故为空。顺便说一句,allowTypes 仅适用于mode="advanced",但这与具体问题没有进一步的关系。
  • 相关:code.google.com/p/primefaces/issues/detail?id=3807 它说当上传元素存在但标记为禁用时会发生这种情况,某些浏览器似乎在某些情况下隐含地这样做。你用的是哪个浏览器?
  • Chrome 和 Firefox 的结果相同。
  • 是的。选择文件并使用 actionListner 在高级模式下单击上传按钮以及在单击单独的非 ajax 按钮时使用简单模式时会发生此错误。
  • 正如code.google.com/p/primefaces/issues/detail?id=3807 帖子所建议的,我添加了 if(file == null || "".equals(file.getFileName())){ return "";仍然存在错误。正如该链接所建议的那样,Elite 3.5.9 和 4.0 存在一个错误并且已经修复。

标签: jsf file-upload file-io primefaces


【解决方案1】:

当版本从 3.3 更改为 3.5 时,我也遇到了同样的问题

但最终得到下面给出的第二个解决方案

第一种解决方案

primefaces高级文件上传有问题

我认为mode="simple"p:fileUpload 标签中的问题

制作mode="advanced" 并测试一次。

如果可以的话,那就好了

问题是你给 mode="simple" 并试图以高级方式处理。

第二个解决方案 使您的文件上传如下所示以简单的方式处理

<p:fileUpload value="#{staffController.file}" mode="simple"/>  

    <p:commandButton value="Submit" ajax="false" actionListener="#{staffController.upload}"/>  

在您的支持 Bean/Controller/staffController 中

创建一个属性

    private UploadedFile file;

//getter setters

然后放一个 upload 方法,如下所示

public void upload() {
        System.out.println("uploading");
        if(file != null) {  
            FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " is uploaded.");  
            FacesContext.getCurrentInstance().addMessage(null, msg);  
        }
        System.out.println("uploaf finished");
    }  

希望对你有帮助

Sources

您好,很抱歉回复晚了。

请检查您是否在 web.xml 中为 servlet 添加了文件上传过滤器。

1)

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name><!-- your FacesServlet Name -->
</filter-mapping>

2)

在lib文件夹中添加commons-fileupload1.3.jar文件

3)

确认你的表单是否有 enctype 属性

<h:form enctype="multipart/form-data">   <!-- enctype tag is important -->

请检查以上 3 点。

【讨论】:

  • 非常感谢。我尝试了两种方法。最初使用 fileUploadListner 进行高级模式。然后使用单独的非 ajax 按钮的简单模式,并使用支持 bean 检查空值。还是同样的错误。可能是我的库的问题。解决后我会第一时间反馈。
  • 仍然失败。用3.3替换了3.5,但错误仍然存​​在。
  • 现在可以与 Primefaces 4.0 和 GlassFish 4.0 一起使用,没有任何问题。谢谢
  • @BuddhikaAriyaratne 你做了什么使它与 Primefaces 4 和 GlassFish 4 一起工作?
  • 我删除了 fileUploadListner。
【解决方案2】:

导致文件上传错误的事件不是更新 primefaces,而是 GlassFish 从 3.1 更新到 4.0。当我在 GlassFish 3.1 中简单地部署相同的应用程序时,一切正常。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2017-03-13
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多