o:inputFile 可选并接受验证

o:inputFile optional and accept validation

我想在我的表单中添加一个可选的 "attach screenshot" 字段,所以我使用 o:inputFile 组件:

<o:inputFile id="file" required="false" maxsize="1048576"  accept="image/png,image/gif" />

如果我将该字段留空,则会出现错误:附上屏幕截图:文件“”的媒体类型不匹配 'image/png,image/gif'

我怎样才能使验证成为可选的?

这是由 MyFaces 中的意外行为引起的。它在 Mojarra 中工作正常,当没有选择文件时会给出 null。然而,MyFaces 给出了一个非空 Part 实例,文件名为空,大小为 0。该空 Part 的内容类型默认为 application/octet-stream,因此永远不会匹配指定的accept 属性。

目前,最好的办法是根据当前阶段 ID 和文件大小使 accept 属性成为条件。我们希望它始终在渲染响应阶段进行评估,而在其他阶段仅在文件大小大于 0 时进行评估,否则默认 accept*/*.

accept="#{facesContext.currentPhaseId.ordinal eq 6 
          or component.submittedValue.size gt 0 
              ? 'image/png,image/gif' 
              : '*/*'}"

我会根据 issue 315.

为即将推出的 OmniFaces 2.6 修复此问题