JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■応用の森 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クラスのインターフェースです。
ブラウザの種類などの定数を定義してあります。