環境:Struts 2.3.20 + Apache tiles 2.0.6

問題:上傳檔案的表單有時候沒有其他資料,form裡只有 type=file的textfield 和一個 s:submit
   因為沒特別寫validation (例如xml或action內驗證),就沒去設定這個 upload action的mapping

   但檢查 error log 時發現有這樣的錯誤訊息:

(FileUploadInterceptor  ) 不支援上傳的檔案類型。
   (BasicTilesContainer    ) Unable to find the definition 'action_upload'

 

原因:看到這才想到就算沒特別追加檢核,FileUploadInterceptor 還是會運作,最少也有以下3種常見的錯誤 return

 

 

struts.messages.error.content.type.not.allowed (檔案類型不符合設定)
struts.messages.error.file.too.large (檔案大小超過限制)
struts.messages.error.uploading (檔案上傳發生錯誤)

   所以還是可能會出現需要轉回輸入頁面的情況,如果沒設定轉回的 tiles defenition,使用者就會看見系統發生錯誤的畫面

解法所以還是在 tiles.xml 裡為每個有檔案上傳的表單都設定一個對應的 defenition吧,不論那個 action 本身有沒有其他validation

 

---------------------------------------------------
2016-04-27補充,就算表單沒有驗證 (validation) 也沒有檔案上傳,還是有可能出現錯誤

2016-04-27 17:58:15,407  WARN (CommonsLogger.java:60) - could not find @TilesDefinition for action: {}
2016-04-27 17:58:15,413  WARN (BasicTilesContainer.java:623) - Unable to find the definition 'module_save'

interceptor裡的型態轉換錯誤,例如數字或日期欄位輸入文字被攔截就會造成這樣

為了避免使用者看到ERROR,只要有用到非字串型態的表單都要設定mapping

相关文章