15

サーブレットで zip ファイルを作成しました。ここで、Ajax を使用してそのサーブレットをトリガーし、ユーザーにダウンロード ダイアログを表示させたいと思います。サーブレットをトリガーできますが、保存ダイアログを取得する方法がわかりません。どうすればこれを達成できますか?

4

3 に答える 3

10

「AJAXを使用してファイルをダウンロードする」ことはできません。AJAX とは、JavaScript が処理するためにサーバーからデータをダウンロードすることです。

ユーザーがファイルをダウンロードできるようにするには、ファイル/サーブレットへの単純なリンクを使用するか、本当に JavaScript を使用する必要がある場合は、URL を に割り当てますdocument.location.href

また、サーバー (またはこの場合はサーブレット) が適切な MIME タイプを送信することを確認する必要があります (おそらく ZIP ファイルの場合) application/zip

于 2010-08-17T12:28:34.883 に答える
9

これには 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()

以下も参照してください。

于 2010-08-17T13:14:22.670 に答える
0
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);
}
于 2012-03-15T12:24:13.683 に答える