サーブレットで zip ファイルを作成しました。ここで、Ajax を使用してそのサーブレットをトリガーし、ユーザーにダウンロード ダイアログを表示させたいと思います。サーブレットをトリガーできますが、保存ダイアログを取得する方法がわかりません。どうすればこれを達成できますか?
3 に答える
「AJAXを使用してファイルをダウンロードする」ことはできません。AJAX とは、JavaScript が処理するためにサーバーからデータをダウンロードすることです。
ユーザーがファイルをダウンロードできるようにするには、ファイル/サーブレットへの単純なリンクを使用するか、本当に JavaScript を使用する必要がある場合は、URL を に割り当てますdocument.location.href
。
また、サーバー (またはこの場合はサーブレット) が適切な MIME タイプを送信することを確認する必要があります (おそらく ZIP ファイルの場合) application/zip
。
これには Ajax を使用できません。基本的に、エンドユーザーがファイル コンテンツをローカル ディスク ファイル システムに保存できるようにする必要があります。ファイル コンテンツを、何もできない JavaScript 変数に割り当てるのではありません。JavaScript には、明らかにセキュリティ上の理由から、ファイル コンテンツが任意の JavaScript 変数から提供される [名前を付けて保存] ダイアログをプログラムでトリガーする機能がありません。
プレーンなバニラ リンクをサーブレットの URL に向けて、サーブレットに HTTPContent-Disposition
ヘッダーを に設定させるだけattachment
です。ブラウザーに [名前を付けて保存] ダイアログを強制的に表示させるのは、具体的にはこのヘッダーです。基礎となるページは同じままで、更新されることもなく、Ajax と同じエクスペリエンスを実現します。
基本的:
<a href="fileservlet/somefilename.zip">download file</a>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
response.setHeader("Content-Type", getServletContext().getMimeType(fileName));
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
// ...
}
これは、Ajax 呼び出し全体を起動せずに、以下のように JavaScript で実行することもできます。
window.location = "fileservlet/somefilename.zip";
または、これに実際に POST を使用している場合は、サーブレットの URL を参照する (非表示の) 同期 POST フォームを使用し、JavaScript にそれを実行させますform.submit()
。
以下も参照してください。
function down() {
var url = "/Jad";
var xmlhttp;
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
//alert("xmlhttp.status" + xmlhttp.status);
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
}
}
xmlhttp.open("GET", url, true);
xmlhttp.send();
var elemIF = document.createElement("iframe");
elemIF.src = url;
elemIF.style.display = "none";
document.body.appendChild(elemIF);
}