0

私は Ajax と VRaptor を介して xls を直接ダウンロードしています。VRaptor は論文を作成し、以下のコードとしてファイルを提供します。

public Download geraExcel() {
 File arquivo = //generate file 
 return new FileDownload(file, "MyFile.xls", "application/vnd.ms-excel", true);
}

問題は、ajax の成功でこのファイルを受信することです。これを行うコードがあり、txt で完全に機能します。問題は、xls が破損して開くことであり、回避するための解決策を長い間研究しています。失敗、継続ファイルが壊れています。誰かがそれを機能させる別の方法を知っているなら、私は感謝します。Ajax.success 次のコード:

success: function(response, status, xhr) {
    // check for a filename
    var filename = "";
    var disposition = xhr.getResponseHeader('Content-Disposition');
    if (disposition && disposition.indexOf('attachment') !== -1) {
        var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
        var matches = filenameRegex.exec(disposition);
        if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
    }

    var type = xhr.getResponseHeader('Content-Type');
    var blob = new Blob([response], { type: type });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        var URL = window.URL || window.webkitURL;
        var downloadUrl = URL.createObjectURL(blob);

        if (filename) {
            // use HTML5 a[download] attribute to specify filename
            var a = document.createElement("a");
            // safari doesn't support this yet
            if (typeof a.download === 'undefined') {                
                window.location = downloadUrl;
            } else {
                a.href = downloadUrl;
                a.download = filename;
                document.body.appendChild(a);
                a.click();

                //Here is the problem, the original is about 15k,  
                // but the download file is about 26K

            }
        } else {                    
            window.location = downloadUrl;
        }

        setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
    }
}
4

0 に答える 0