rich:fileUpload随机失败,"传输失败"错误

时间:2014-05-22 07:44:15

标签: jsf file-upload richfaces

我正在使用RichFaces 3.3.3 Final的<rich:fileUpload>。当我在Chrome浏览器中上传某些Excel文件时,它有时会显示“传输失败”错误消息,如下面的屏幕截图所示:

示例代码,

<rich:fileUpload id="fileUpload" addControlLabel="#{bundle.browse}"
                 allowFlash="#{not TestFileUpload.allow}"
                 fileUploadListener="#{TestFileUpload.fileUploadListener}"
                 maxFilesQuantity="10"  
                 autoclear="false"
                 listHeight="135px;"
                 uploadControlLabel="#{bundle.upload}"
                 progressLabel="#{bundle.progress}"
                 sizeErrorLabel="#{bundle.sizeError}"
                 noDuplicate="true" 
                 style="width: 100%; height: 135px;">

    <a4j:support event="onuploadcomplete" 
                 onbeforedomupdate=""
                 action="#{TestFileUpload.validateExcel}" 
                 reRender="validationDetailPanelId, messageId"
                 focus="cancelId"/>
</rich:fileUpload>

Web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Production</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.DISABLE_FACELET_JSF_VIEWHANDLER</param-name>
        <param-value>true</param-value>
    </context-param>

    <!--Configuration for Facelets-->
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.jsp</param-value>
    </context-param>
    <context-param>
        <param-name>
            facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE
        </param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
        <param-value>*.xhtml</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.verifyObjects</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>

    <context-param>
        <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadStyleStrategy</param-name>
        <param-value>all</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadScriptStrategy</param-name>
        <param-value>all</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <context-param>
        <param-name>org.ajax4jsf.SKIN</param-name>
        <param-value>Wine</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.CONTROL_SKINNING</param-name>
        <param-value>enable</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>
            /WEB-INF/test/faces-config.xml
    </param-value>
    </context-param>
    <filter>
        <display-name>RichFaces Filter</display-name>
        <filter-name>Ajax4jsf</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
        <init-param>
            <param-name>enable-cache</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>createTempFiles</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>maxRequestSize</param-name>
            <param-value>1048576</param-value>
        </init-param>
    </filter>
    <filter>
        <filter-name>SFilter</filter-name>
        <filter-class>com.test.SFilter</filter-class>
    </filter>
    <listener>
        <display-name>SLCListener</display-name>
        <listener-class>com.test.SLCListener</listener-class>
    </listener>
    <!-- End of Rich Faces and A4JSF -->

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Custom Faces Servlet</servlet-name>
        <servlet-class>com.test.CFServlet</servlet-class>
        <init-param>
            <param-name>error</param-name>
            <param-value>/faces/pages/errorPage.jsp</param-value>
        </init-param>

        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>ASServlet</servlet-name>
        <servlet-class>com.test.ASServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>PASRServlet</servlet-name>
        <servlet-class>com.test.PASRServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>LOServlet</servlet-name>
        <servlet-class>com.test.LOServlet</servlet-class>
        <init-param>
            <param-name>DException</param-name>
            <param-value>/faces/pages/dException.jsp</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>FDServlet</servlet-name>
        <servlet-class>com.test.FDServlet</servlet-class>
    </servlet>

    <!--OverRiding FacesServlet Start-->
    <servlet-mapping>
        <servlet-name>Custom Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Custom Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>


    <!--Filter for ajaxrequest and Custom Faces Servlet-->
    <filter-mapping>
        <filter-name>Ajax4jsf</filter-name>
        <servlet-name>Custom Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>
    <filter-mapping>
        <filter-name>SSEFilter</filter-name>
        <servlet-name>Custom Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </filter-mapping>
    <!--End-->

    <!-- Filter for Commons File Upload -->
    <filter>
        <filter-name>Extensions Filter</filter-name>
        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
        <init-param>
            <param-name>uploadMaxFileSize</param-name>
            <param-value>20m</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>Extensions Filter</filter-name>
        <servlet-name>Custom Faces Servlet</servlet-name>
    </filter-mapping>

    <!-- End of commons file upload filter -->
    <error-page>
        <error-code>404</error-code>
        <location>/faces/pages/error/errorPage.jsp</location>
    </error-page>
  </web-app>

enter image description here

该文件也未上传到服务器。这是怎么造成的,我该如何解决?

2 个答案:

答案 0 :(得分:0)

自Chrome最新更新以来,我遇到了同样的问题。 Chrome版本:36

单击上传按钮时,bean中的fileUploadListener方法被调用两次。 调试模式显示第二次,文件丢失。

我绕过了这样的问题:

public void fileUploadListener(UploadEvent event) {

    if(!event.getUploadItem().getFileName().equalsIgnoreCase("")){
        //code here
    }

}

答案 1 :(得分:0)

首先在web.xml中创建bean会话范围,将createTempFiles的boolean属性更改为false而不是true,如下所示:

    <init-param>
        <param-name>createTempFiles</param-name>
        <param-value>false</param-value>
    </init-param>