4

我正在尝试使用richfaces fileupload 组件上传文件。我的 bean 在视图范围内。

我从陈列柜中提取的代码。

            <rich:fileUpload  id="upload" immediateUpload="true" fileUploadListener="#{analyse.listener}"  acceptedTypes="png" ontyperejected="alert('Seulement les fichiers avec l'extension bam et pdf sont acceptés.');" maxFilesQuantity="3">
                  <a4j:ajax event="uploadcomplete" execute="@none" />        
            </rich:fileUpload>

bean函数调用:

    public void listener(FileUploadEvent event) throws Exception {


    System.out.println("Listenner");

    UploadedFile item = event.getUploadedFile();

    System.out.println(item.getName());
    System.out.println(item.getSize());
    System.out.println(item.getContentType()) ;

}     

当我尝试添加要上传的文件时,我得到一个漂亮的错误:-(。欢迎帮助。

11 月 6 日 2013 19:00:43 org.richfaces.request.MultipartRequest25 parseIfNecessary GRAVE:解析多部分请求的异常:无法读取请求序言 org.richfaces.exception.FileUploadException:解析多部分请求的异常:无法在 org.richfaces.request 读取请求序言.MultipartRequestParser.parse(MultipartRequestParser.java:156) 在 org.richfaces.request.MultipartRequest25.parseIfNecessary(MultipartRequest25.java:77) 在 org.richfaces.request.MultipartRequest25.getParameter(MultipartRequest25.java:114) 在 com.sun。 faces.context.RequestParameterMap.get(RequestParameterMap.java:75) at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:56) at java.util.Collections$UnmodifiableMap.get(Collections.java:1280)在 com.sun.faces.facelets.tag.ui.UIDebug.debugRequest(UIDebug. MultipartRequestParser.parse(MultipartRequestParser.java:148) ... 70 更多 11 月 6 日。2013 19:00:43 com.sun.faces.context.flash.ELFlash$PreviousNextFlashInfoManager 解码 GRAVE:JSF1094:无法从传入的 cookie 值 3Xfn_ 解码闪存数据。处理将继续,但闪存不适用于此请求。11 月 6 日 2013 19:00:43 org.apache.catalina.core.ApplicationDispatcher 调用 GRAVE:“Servlet.service()”为 servlet facesServlet 在 com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter 上出现异常 java.lang.NullPointerException (PartialViewContextImpl.java:485) 在 com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:73) 在 com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter。ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org .apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol .java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 在 java. util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 在 java.lang.Thread.run(Thread.java:680) 11 月 6 日。2013 年 19:00:43 组织。进程(AbstractHttp11Processor.java:1023)在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 在 java.lang.Thread.run(Thread.java :680) 11 月 6 日。2013 19:00:43 org.richfaces.request.MultipartRequest25 parseIfNecessary GRAVE:解析多部分请求的异常:无法读取请求序言 org.richfaces.exception.FileUploadException:解析多部分请求的异常:无法在 org.richfaces.request 读取请求序言.MultipartRequestParser.parse(MultipartRequestParser.java:156) 在 org.richfaces.request。AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor. java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:680) 原因:java.io.IOException: Request prolog cannot阅读 org.richfaces.request.MultipartRequestParser.initialize(MultipartRequestParser.java:172) 的 org.richfaces.request.MultipartRequestParser.readProlog(MultipartRequestParser.java:270) 的 org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java :148) ... 11 月 6 日还有 34 个。2013 19:00:43 com.sun.faces.context.flash。ELFlash$PreviousNextFlashInfoManager 解码 GRAVE:JSF1094:无法从传入的 cookie 值 3Xfn_ 解码闪存数据。处理将继续,但闪存不适用于此请求。11 月 6 日 2013 19:00:43 org.apache.catalina.core.ApplicationDispatcher 调用 GRAVE:“Servlet.service()”为 servlet facesServlet 在 com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter 上出现异常 java.lang.NullPointerException (PartialViewContextImpl.java:485) 在 com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:73) 在 com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:619) 在 javax .faces.context.PartialResponseWriter.startDocument(PartialResponseWriter.java:116) 在 org.

4

1 回答 1

8

总结:使用<h:inputFile />,至少我无法<rich:fileUpload>在 JSF-2.2 中工作

长版: 花了一天的时间搞砸后,<rich:fileUpload>我得出的结论是,遵守 Servlet-3.0 规范的 servlet 容器在这里处于困境和艰难的境地。

似乎正在发生的事情是 Tomcat(或任何实现 Servlet-3.0 及更高版本的 servlet 容器 - 我尝试使用 Wildfly 的 undertow)通过HttpServletRequest#getParts()方法使多部分 POST 提交可用。它还可以很好地解析表单数据,并通过ServletRequest#getParameter使其可用,它明确指出:

如果参数数据是在请求正文中发送的,例如发生在 HTTP POST 请求中,则直接通过 getInputStream() 或 getReader() 读取正文可能会干扰此方法的执行。

如果您使用不存在的参数名称MultipartRequest25调用它的方法,这正是这样做的:getParameter

 String parameter = super.getParameter(name);
 if (parameter != null) {
     return parameter;
 }
 parseIfNecessary();

parseIfNecessary()部分尝试读取序言,但是由于容器已经解析了请求主体,因此流是空的,并且从中读取会产生一个立即数,该立即EOF数会被转换为IOException我们所看到的。

从类命名中,我了解到这是为 Servlet-2.5 容器编写的,这可能有效,而且信息不容易获得。

在这一点上,我决定利用我对 JSF-2.2 的使用并切换到h:inputFile,当您使用最新的(在撰写本文时)Mojarra-2.2.5(还没有尝试过 Myfaces)时,它的效果非常好。

这是一个例子:

<h:form id="fileUploadForm" enctype="multipart/form-data">
    <h:inputFile value="#{docMgr.file}" required="true">
        <f:ajax listener="#{docMgr.saveFile}" render="@form" />
    </h:inputFile>
    <h:messages />
</h:form>

请注意,Mojarra-2.2.5 之前的版本存在 ajax 提交问题,如上面的示例(模仿 RichFaces' immediateUpload.

于 2014-01-16T09:01:32.817 回答