ファイルアップロードの上限サイズを超えてもindexメソッドに制御が移らないケース
ファイルアップロードの上限サイズを超えた場合について、SAStrutsのサイトでは以下のように記述されています。
アップロードされたファイルのサイズが、あらかじめ決められた上限(struts-config.xmlのcontrollerタグのmaxFileSize属性の値) を超えた場合、SizeLimitExceededExceptionがスローされます。
この例外が発生した場合は、indexメソッドに制御が移るので、 indexメソッドで、SizeLimitExceededExceptionの存在をチェックすることで、アップロードされたファイルが上限を超えたのかチェックすることができます。
Super Agile Struts - Tutorial
しかし、自分の環境では何故かindexメソッドに制御が移らず、フォームがPOSTされていないような挙動になりました。
何が違うのかチュートリアルと見比べてみた所、フォームをサブミットする際にaタグ+javascriptを使っていたのが原因のようでした。
以下はチュートリアルのアップロードのサンプルを簡素にした例。
<s:form enctype="multipart/form-data"> <input type="file" name="formFile" /> <input type="submit" name="upload" value="アップロード"/> </s:form>
次にこちらは、上記の例を自分のソースではどのように実装していたかというもの。
<s:form enctype="multipart/form-data" action="/upload/upload/"> <input type="file" name="formFile" /> <a href="javascript:document.uploadActionForm.submit();">アップロード</a> </s:form>
submitボタンのname属性で実行メソッドを渡す代わりに、formタグのaction属性で実行メソッドを自分で指定して、aタグのjavascriptでフォームをサブミットしていました。
なぜこんなことをしているかというと、デフォルトのボタン系タグではデザイン的に寂しい感じなので、aタグとdivタグにスタイルシートを効かせて疑似ボタンをデザインしているため。
疑似ボタンをsubmitボタンにするという対応方法はナシなので、以下の方法で代替することにしました。
aタグをクリックした時に、javascriptで非表示にしたsubmitボタンをクリックするという方法。javascript部分はjQueryを使っています。
<s:form enctype="multipart/form-data"> <input type="file" name="formFile" /> <input type="submit" name="upload" value="アップロード" style="display:none;"/> <a href="javascript:$(':submit').click();">アップロード</a> </s:form>
これでちゃんと上限サイズを超えた場合にindexメソッドに制御が移るようになりました。