5

GSP にこの ajax 呼び出しがあります。

$.ajax({
    url: '${request.contextPath + '/Ticket/passAll'}',
    type: 'POST',
    data: data,
    success: function() {
        alert("Success");
    }
});

これは、私のコントローラー アクションのコード ブロックです。

response.setHeader("Content-disposition", "attachment; filename=sample.csv")
response.contentType = "application/vnd.ms-excel"

def outs = response.outputStream
def cols = [:]

tickets.each() {
    outs << it.ticketNo + ";" + it.subject
    outs << "\n"
}

outs.flush()
outs.close()

$.Ajax メソッドを介してビューから渡すデータからチケット リストを取得します。そのデータを CSV としてフォーマットし、そのデータを CSV ファイルとしてエクスポートしたいのですが、何も起こりません。データはクライアントに送信されますが、コンテンツの配置が適切に形成されていないため、ダウンロードするファイルがありません。私は何が欠けていますか?私は次のようなことをしようとしました:

$.ajax({
    url: '${request.contextPath + '/Ticket/passAll'}',
    type: 'POST',
    data: aoData,
    dataType: 'text',
    success: function(result) {
        var uri = 'data:application/csv;charset=UTF-8,' + encodeURIComponent(result);
        window.open(uri, 'tiketi.csv');
    }
});

コントローラーでプレーン文字列を生成しますが、そのようにして、受け入れられない拡張子のないファイルを取得します。

どうすればこれを達成できますか?ありがとうございました。

4

4 に答える 4

14

ajax経由で行う必要はありません。ページは、ファイルのダウンロードのためにリダイレクトされません。

于 2013-01-16T15:56:41.660 に答える
6

引用符が衝突しているので、urlプロパティを修正する必要があると思います。

試してみてください:

$.ajax({
    url: "${request.contextPath}/Ticket/passAll",
    type: 'POST',
    data: aoData,
    dataType: 'text',
    success: function(result) {
        var uri = 'data:application/csv;charset=UTF-8,' + encodeURIComponent(result);
        window.open(uri, 'tiketi.csv');
    }
});
于 2013-01-16T15:42:07.580 に答える
6

私の知る限り、AJAX 経由でファイルのダウンロードをトリガーすることはできません。代わりに、次のようなことを行うことができます (例: jQuery を使用):

function downloadComplete(){ hideSpinner();}
function downloadStart(){ showSpinner();}

function download(){
    downloadStart()
    var urlParams = data // or e.g. $(form).serialize() 
    var downloadUrl = "${request.contextPath}/Ticket/passAll?" + urlParams 
    $("#download-iframe").remove()
    $('<iframe style="display:none" id="download-iframe" src="' + downloadUrl + '" onreadystatechange="downloadComplete()" onload="downloadComplete()">').appendTo('body');
}

GET-request: "security" または引数が多すぎるため、問題が発生する可能性があります。しかし、通常は問題ないはずです。

于 2013-01-16T15:57:52.883 に答える