我在 Tomcat 8.5 服务器上的 web.xml-version 3.1 中使用 JSF 2.3 (Mojarra 2.3.3)、Trinidad (2.2.1) 及其文件上传组件 (tr:inputFile)。
我收到以下异常,并且没有有效的上传文件(即“值”绑定 bean 属性保持为空):
java.io.EOFException: null
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler._readLine(MultipartFormHandler.java:253) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler._readLine(MultipartFormHandler.java:237) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler._skipBoundary(MultipartFormHandler.java:223) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.<init>(MultipartFormHandler.java:102) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.<init>(MultipartFormHandler.java:75) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.config.upload.FileUploadConfiguratorImpl.beginRequest(FileUploadConfiguratorImpl.java:139) [trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.config.GlobalConfiguratorImpl._startConfiguratorServiceRequest(GlobalConfiguratorImpl.java:763) [trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.config.GlobalConfiguratorImpl.beginRequest(GlobalConfiguratorImpl.java:244) [trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:178) [trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92) [trinidad-api-2.2.1.jar:2.2.1]
(信息:Tomcat 6 或 Weblogic 10 上带有 Trinidad 1.2.14 和 web.xml-version 2.5 的 JSF 1.2 版本不存在此问题。)
在寻找解决方案时,我发现这似乎不仅影响我的具体情况,而且还影响:
- ADF 面(至少 12.x)
- 特立尼达2.1
- JSF 2.x 概述
- 野蝇 (10.1)
为了寻找答案,我开发了一个想要分享的解决方案。
使用 JSF 的<h:inputFile>
(自 JSF 2.2 起)而不是<tr:inputFile>
.
您可以继续使用<tr:form usesUpload="true">
,但请参阅下面的注释。
在支持 bean 中,您只需替换org.apache.myfaces.trinidad.model.UploadedFile
with javax.servlet.http.Part
并使用getSubmittedFileName()
代替getFileName()
.
这样,文件上传已经可以工作了,但是EOFException
仍然发生并被记录(但在内部被忽略)。
为了防止需要的TrinidadFilter
(配置在web.xml
)从处理文件上传中,添加您自己的javax.servlet.Filter
(我猜大多数应用程序已经有一个)并将其放入doFilter()
:
request.setAttribute("org.apache.myfaces.trinidadinternal.config.upload.FileUploadUtils.PROCESSED", Boolean.TRUE);
当然,你的过滤器必须被执行before the TrinidadFilter
,因此要么使用更广泛的过滤器映射,要么将其放在 TrinidadFilter 之前web.xml
.
补充笔记:
- 使用时
<tr:form>
the <h:inputFile>
将输出错误的错误/警告“文件上传组件需要一个 enctype 为 multipart/form-data 的表单”通过 FacesMessage - 但是not for javax.faces.PROJECT_STAGE
生产。
您可以在开发或使用时忽略它<h:form enctype="multipart/form-data">
反而。但请注意:<h:form>
是一个命名容器并且<tr:form>
不是,因此寻址输入元素不同(hformId:inputId
而不是简单的inputId
)
- If your
<tr:inputFile>
被用在一个内部<tr:panelFormLayout>
, 放在<h:inputFile>
里面一个<tr:panelLabelAndMessage>
并将标签放在那里。
- CSS 样式
af|inputFile::content
还必须这样做input[type="file"]
.
也可以看看:
- https://stackoverflow.com/a/27681292/5074004 https://stackoverflow.com/a/27681292/5074004
- https://developer.jboss.org/thread/274824?_sscc=t https://developer.jboss.org/thread/274824?_sscc=t
- http://myfaces.10567.n7.nabble.com/Trinidad-File-upload-issue-td30231.html http://myfaces.10567.n7.nabble.com/Trinidad-File-upload-issue-td30231.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)