2016-09-21 34 views
1

我想一個可選的「附加截圖」字段添加到我的形式,所以我使用的○:INPUTFILE組件:○:INPUTFILE可選的,並接受驗證

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

如果我離開該字段爲空我得到一個錯誤:附加屏幕截圖:文件的媒體類型''不匹配'image/png,image/gif'

如何使該驗證可選?

+0

奇怪,您使用的是哪種瀏覽器?這在最新的Chrome和Firefox中不會發生。而且,當沒有物理文件時,驗證不應該運行。顯然你的瀏覽器以某種方式發送/觸發了一個空的「Part」。有一個理論上的解決方法(在'accept'屬性中只是一些有條件的EL),但我想先自己複製它。 – BalusC

+0

它適用於任何瀏覽器。我無法在此上傳示例項目,所以我在該項目中打開了一個問題。 https://github.com/omnifaces/omnifaces/issues/315 我的環境是:myfaces 2.2.10,omnifaces 2.5.1,tomee – cocorossello

回答

1

這是由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。

+0

它的工作,謝謝! – cocorossello

+0

不客氣。 – BalusC

+0

正如我在搜索一些信息時剛剛遇到此線程:文件擴展名(例如「image/png」)似乎區分大小寫。如果我嘗試上傳名爲test.PNG的文件,我的驗證失敗。這是否按預期工作? 我的Omnifaces版本是2.6.2。 – sofarsoghood