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 修复此问题
我想在我的表单中添加一个可选的 "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 修复此问题