jQueryでファイルダウンロード

More than 5 years have passed since last update.

ハマったので備忘録としてメモ。

画面でボタンをクリックするとファイルのダウンロードを行う処理。

ファイルが無い場合は画面遷移を行わずに画面へエラーメッセージまたはダイアログで通知したい。

サーバはJavaを使用。FWは使用しない。(SAStrutsなら簡単そう?)

ダイアログを出すならAjaxかなと思いjQueryを使用。

Servletの非同期呼び出しは下記のように$.postで呼び出し、パラメータとコールバックメソッドを指定する

function download(parameter) {

query = {
parameter : parameter,
}
$.post("/DownloadServlet", query, read);
}

function read(resp) {
// コールバック関数でなんか処理
}

ただ、Ajaxだとレスポンスをjavascriptが解釈してしまい、ブラウザのダイアログによるファイルダウンロードを行うことができない。

そのため、最初の非同期呼び出しでチェック処理だけ行い、ファイルが無ければコールバック関数でダイアログを表示、ファイルがあれば別のファイルダウンロード用サーブレットを呼び出すことで対応した。

function download(parameter) {

query = {
parameter : parameter,
}
$.post("/DownloadFileCheckServlet", query, read);
}

function read(resp) {
// コールバック関数でなんか処理
if (resp.length == 0) {
// レスポンスに何も入力されて無ければファイル有り(とする)サーブレットをGetメソッドで呼び出し
location.href = "/DownloadServlet";
} else {
// レスポンスに入力されていればエラーメッセージとしてダイアログに出力(とする)
alert(resp);
}
}

これでチェック処理でエラーが発生した時はレスポンスにエラーメッセージを書き込めばダイアログが表示され、レスポンスに何も書き込まれなかった(エラーでない)場合はファイルダウンロード用サーブレットが呼ばれてブラウザによるダウンロードが開始される。

チェック処理とファイルダウンロード処理で別サーブレットになるので、セッションで値を共有しました。

ここは一時フォームを作成してPostメソッドでsubmitしても良いかもしれません。

下記のサイトを参考にさせて頂きました。ありがとうございます。

http://chez-sugi.net/journal-20070306