■応用の森 Ajaxを使ったファイルダウンロードサンプル |
|
|
|
![]() |
|
なんか、前回のアップロード画面と同じジャン?! とお思いでしょう。 それもそのはず、前回のAjaxアップロードのロジックを半分以上(というかほとんど)流用しています 理由は、Ajaxでファイルをアップロードすると、送ったファイルをブーメランで 即座にダウンロードしてしまうという目的のためにアップロード機能を流用しています。 操作は前回とまったく同じなので、さっそく動作確認してみましょう。 正直に申し上げておきますが、Ajaxの機能としては、ファイルの保存ダイアログを表示して ファイルをダウンロードするという機能はないので、Ajaxのコールバック処理結果の状況を判定して 通常のGETメソッドで、ダウンロードサーブレットを呼び出すという仕掛けになっています。 Ajaxの処理結果としてのコールバック処理に、データをByte配列とかBase64エンコードとかで送り返せば なんか処理できそうな気もしますが、保存確認ダイアログが出せないのとそこまでしてAjaxにこだわる 確固とした理由も見いだせないので、こんな感じでまとめています。 |
|
それでは、プログラムの解説です。 | |
1)コントローラ | |
src/main/java/jp/dip/arimodoki/cntl/FileDownloadAjax.java 前回のファイルアップロードコントローラと基本的には変わりません 前回と違うところ。 1)ファイルアップロード用ハンドラマッピング名 まずマッピング名が異なります。(同名マッピングはできないので当然ですが) 2)ファイルアップロード用ハンドラ 前回使用したハンドラに似ていますが微妙に異なります。 ハンドラメソッドuploadajax()の引数に、HttpSession sessionが追加されています。 これは、後述のダウンロードハンドラメソッドでファイルをダウンロードさせるために ここで受信したファイル情報を、HTTPSessionに保持しておくためのパラメータです。 3)ファイルダウンロード用ハンドラ ファイルダウンロード用のdownloadajax()メソッドが追加されています。 uploadajax()でSessionに記憶しておいたファイル情報を取り出して、 ファイル名に全角が含まれていた場合、Javaはちょっと面倒で ブラウザの種類(特に、FireFox)により微妙に処理が違うので HTTPリクエストのユーザーエージェント文字列からブラウザの種類を判別して ブラウザでダウンロードするファイル名を生成します。 HTTPヘッダーやら、ファイルサイズやらを、HTTPレスポンスに設定して FileCopyUtilsでエイヤァ!とブラウザにファイルを送り返します。ふぅ。 |
|
2)View(HTML) | |
WebContent/filedownloadajax.html こちらも基本的には前回使った、jQueryとほぼ同じです。 違いはjQuery部の最後の方に、$('#droppable').on('DOMSubtreeModified propertychange') というメソッドが追加されています。(これ以外は前回とまったく同じです) これが無くても動くことは動くのですが、GooGle Chrome以外のブラウザでは 送信完了画像が表示されないのでこの関数を追加しました。 DROPボックス内の要素に変更があるとこのイベントハンドラが実行されるので、 このハンドラで、ファイルダウンロードサーブレット(downloadajax.xhtml)を呼び出すことで ファイルのダウンロードが実行されます。 |
|
3)ブラウザの種類チェッククラス | |
src/main/java/jp/dip/arimodoki/common/CheckBrowser.java ファイルダウンロード時の、HTTPリクエスト ユーザーエージェント情報よりブラウザの種類を判定するクラスです。 アップロードされたファイル名に、日本語(全角)文字がある場合の、 ダウンロードファイル名処理で、ブラウザの種類により微妙に処理が異なるために、 ブラウザの種類を判定するためのクラスです。 |
|
4)ブラウザの種類チェッククラスのインターフェース | |
src/main/java/jp/dip/arimodoki/common/CheckBrowserIf.java CheckBrowserクラスのインターフェースです。 ブラウザの種類などの定数を定義してあります。 |
jQuery/JavaScriptの小技集 ![]() |
File APIを使用した、Ajaxファイルダウンロードサンプル |