it-swarm.com.de

Laden Sie eine Datei von jQuery.Ajax herunter

Ich habe eine Struts2-Aktion auf der Serverseite zum Herunterladen von Dateien.

<action name="download" class="com.xxx.DownAction">
    <result name="success" type="stream">
        <param name="contentType">text/plain</param>
        <param name="inputName">imageStream</param>
        <param name="contentDisposition">attachment;filename={fileName}</param>
        <param name="bufferSize">1024</param>
    </result>
</action>

Wenn ich die Aktion jedoch mit der jQuery aufrufe:

$.post(
  "/download.action",{
    para1:value1,
    para2:value2
    ....
  },function(data){
      console.info(data);
   }
);

in Firebug sehe ich, dass die Daten mit dem Binär-Stream abgerufen werden. Ich frage mich, wie man das Fenster zum Herunterladen von Dateien öffnet , mit dem der Benutzer die Datei lokal speichern kann.

381
hguser

2019 modernes Browser-Update

Dies ist der Ansatz, den ich jetzt mit ein paar Einschränkungen empfehlen würde:

  • Ein relativ moderner Browser ist erforderlich
  • Wenn erwartet wird, dass die Datei sehr groß ist , sollten Sie wahrscheinlich etwas Ähnliches wie beim ursprünglichen Ansatz (iframe und cookie) tun, da einige der folgenden Vorgänge wahrscheinlich sind Verbrauchen Sie mindestens so viel Systemspeicher wie die heruntergeladene Datei und/oder andere interessante CPU-Nebenwirkungen.
fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.blob())
  .then(blob => {
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    // the filename you want
    a.download = 'todo-1.json';
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
    alert('your file has downloaded!'); // or you know, something with better UX...
  })
  .catch(() => alert('oh no!'));

2012 Original jQuery/iframe/Cookie-basierter Ansatz

bläulich ist völlig richtig, Sie können dies nicht über Ajax tun, da JavaScript Dateien nicht direkt auf dem Computer eines Benutzers speichern kann (aus Sicherheitsgründen). Wenn Sie die Hauptfenster URL auf Ihren Dateidownload verweisen, haben Sie leider nur wenig Kontrolle über die Benutzererfahrung, wenn ein Dateidownload stattfindet.

Ich habe jQuery File Download erstellt, das eine Ajax-ähnliche Erfahrung mit Dateidownloads einschließlich OnSuccess- und OnFailure-Rückrufen ermöglicht, um eine bessere Benutzererfahrung zu ermöglichen. Schauen Sie sich in meinem Blog-Beitrag das häufig auftretende Problem an, das das Plugin löst, und einige Verwendungsmöglichkeiten sowie eine Demo von jQuery File Download in Aktion . Hier ist das Quelle

Hier ist eine einfache Use-Case-Demo mit dem Plugin source with promises. Die Demoseite enthält auch viele andere, 'bessere' UX-Beispiele.

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });

Abhängig von den Browsern, die Sie unterstützen müssen, können Sie möglicherweise https://github.com/eligrey/FileSaver.js/ verwenden. Dies ermöglicht eine explizitere Steuerung als die von jQuery File Download verwendete IFRAME-Methode.

627
John Culviner

Niemand hat dies gepostet @ Pekkas Lösung ... also werde ich es posten. Es kann jemandem helfen.

Sie müssen dies nicht über Ajax tun. Benutz einfach

window.location="download.action?para1=value1...."
206
bluish

Du kannst mit HTML5

NB: Die zurückgegebenen Dateidaten MÜSSEN base64-codiert sein, da Sie keine binären Daten mit JSON codieren können

In meiner Antwort AJAX habe ich eine Datenstruktur, die so aussieht:

{
    result: 'OK',
    download: {
        mimetype: string(mimetype in the form 'major/minor'),
        filename: string(the name of the file to download),
        data: base64(the binary data as base64 to download)
    }
}

Das bedeutet, dass ich Folgendes tun kann, um eine Datei über AJAX zu speichern

var a = document.createElement('a');
if (window.URL && window.Blob && ('download' in a) && window.atob) {
    // Do it the HTML5 compliant way
    var blob = base64ToBlob(result.download.data, result.download.mimetype);
    var url = window.URL.createObjectURL(blob);
    a.href = url;
    a.download = result.download.filename;
    a.click();
    window.URL.revokeObjectURL(url);
}

Die Funktion base64ToBlob wurde aus hier übernommen und muss in Übereinstimmung mit dieser Funktion verwendet werden

function base64ToBlob(base64, mimetype, slicesize) {
    if (!window.atob || !window.Uint8Array) {
        // The current browser doesn't have the atob function. Cannot continue
        return null;
    }
    mimetype = mimetype || '';
    slicesize = slicesize || 512;
    var bytechars = atob(base64);
    var bytearrays = [];
    for (var offset = 0; offset < bytechars.length; offset += slicesize) {
        var slice = bytechars.slice(offset, offset + slicesize);
        var bytenums = new Array(slice.length);
        for (var i = 0; i < slice.length; i++) {
            bytenums[i] = slice.charCodeAt(i);
        }
        var bytearray = new Uint8Array(bytenums);
        bytearrays[bytearrays.length] = bytearray;
    }
    return new Blob(bytearrays, {type: mimetype});
};

Dies ist gut, wenn Ihr Server die zu speichernden Daten speichert. Allerdings habe ich nicht ganz herausgefunden, wie man einen HTML4-Fallback implementieren würde

34
Luke Madhanga

1. Framework-Agnostiker: Servlet lädt Datei als Anhang herunter

<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
    download
</a>

<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>

2. Struts2 Framework: Aktion Datei als Anhang herunterladen

<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
    download
</a>

<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>

Es ist besser, das Tag <s:a> zu verwenden, das mit OGNL auf eine URL zeigt, die mit dem Tag <s:url> erstellt wurde:

<!-- without JS, with Struts tags: THE RIGHT WAY -->    
<s:url action="downloadAction.action" var="url">
    <s:param name="param1">value1</s:param>
</s:ulr>
<s:a href="%{url}" >download</s:a>

In den obigen Fällen müssen Sie den Content-Disposition -Header in den Antwort , die angibt, dass die Datei heruntergeladen werden muss (attachment) und nicht vom Browser geöffnet werden muss (inline). Sie müssen auch den Inhaltstyp angeben, und Sie möchten möglicherweise den Dateinamen und die Länge hinzufügen (um dem Browser beim Zeichnen einer realistischen Fortschrittsanzeige zu helfen).

Zum Beispiel beim Herunterladen einer Zip:

response.setContentType("application/Zip");
response.addHeader("Content-Disposition", 
                   "attachment; filename=\"name of my file.Zip\"");
response.setHeader("Content-Length", myFile.length()); // or myByte[].length...

Bei Struts2 (es sei denn, Sie verwenden die Aktion als Servlet, z. B. als Hack für direktes Streaming ) müssen Sie nichts direkt in die Antwort schreiben. Die einfache Verwendung von Stream-Ergebnistyp und die Konfiguration in struts.xml wird funktionieren: EXAMPLE

<result name="success" type="stream">
   <param name="contentType">application/Zip</param>
   <param name="contentDisposition">attachment;filename="${fileName}"</param>
   <param name="contentLength">${fileLength}</param>
</result>

3. Framework-Agnostiker (/ Struts2-Framework): Servlet (/ Action), das die Datei im Browser öffnet

Wenn Sie die Datei im Browser öffnen möchten, anstatt sie herunterzuladen, muss die Inhaltsdisposition auf inline gesetzt sein. Das Ziel kann jedoch nicht die aktuelle Fensterposition sein. Sie müssen ein neues Fenster anvisieren, das mit Javascript erstellt wurde, einen <iframe> in der Seite oder ein neues Fenster, das im laufenden Betrieb erstellt wurde, mit dem Befehl "discussion" target = "_ blank":

<!-- From a parent page into an IFrame without javascript -->   
<a href="downloadServlet?param1=value1" target="iFrameName">
    download
</a>

<!-- In a new window without javascript --> 
<a href="downloadServlet?param1=value1" target="_blank">
    download
</a>

<!-- In a new window with javascript -->    
<a href="javascript:window.open('downloadServlet?param1=value1');" >
    download
</a>
26
Andrea Ligios

Ich habe wenig Funktion als Workaround-Lösung erstellt (inspiriert vom @ JohnCulviner-Plugin):

// creates iframe and form in it with hidden field,
// then submit form with provided data
// url - form url
// data - data to form field
// input_name - form hidden input name

function ajax_download(url, data, input_name) {
    var $iframe,
        iframe_doc,
        iframe_html;

    if (($iframe = $('#download_iframe')).length === 0) {
        $iframe = $("<iframe id='download_iframe'" +
                    " style='display: none' src='about:blank'></iframe>"
                   ).appendTo("body");
    }

    iframe_doc = $iframe[0].contentWindow || $iframe[0].contentDocument;
    if (iframe_doc.document) {
        iframe_doc = iframe_doc.document;
    }

    iframe_html = "<html><head></head><body><form method='POST' action='" +
                  url +"'>" +
                  "<input type=hidden name='" + input_name + "' value='" +
                  JSON.stringify(data) +"'/></form>" +
                  "</body></html>";

    iframe_doc.open();
    iframe_doc.write(iframe_html);
    $(iframe_doc).find('form').submit();
}

Demo mit Klick-Event:

$('#someid').on('click', function() {
    ajax_download('/download.action', {'para1': 1, 'para2': 2}, 'dataname');
});
23
ndpu

Die einfache Möglichkeit, den Browser zum Herunterladen einer Datei zu veranlassen, besteht darin, die Anforderung folgendermaßen auszuführen:

 function downloadFile(urlToSend) {
     var req = new XMLHttpRequest();
     req.open("GET", urlToSend, true);
     req.responseType = "blob";
     req.onload = function (event) {
         var blob = req.response;
         var fileName = req.getResponseHeader("fileName") //if you have the fileName header available
         var link=document.createElement('a');
         link.href=window.URL.createObjectURL(blob);
         link.download=fileName;
         link.click();
     };

     req.send();
 }

Dies öffnet das Download-Popup des Browsers.

19
João Marcos

Ok, basierend auf ndpus Code ist hier eine verbesserte (ich denke) Version von ajax_download; -

function ajax_download(url, data) {
    var $iframe,
        iframe_doc,
        iframe_html;

    if (($iframe = $('#download_iframe')).length === 0) {
        $iframe = $("<iframe id='download_iframe'" +
                    " style='display: none' src='about:blank'></iframe>"
                   ).appendTo("body");
    }

    iframe_doc = $iframe[0].contentWindow || $iframe[0].contentDocument;
    if (iframe_doc.document) {
        iframe_doc = iframe_doc.document;
    }

    iframe_html = "<html><head></head><body><form method='POST' action='" +
                  url +"'>" 

    Object.keys(data).forEach(function(key){
        iframe_html += "<input type='hidden' name='"+key+"' value='"+data[key]+"'>";

    });

        iframe_html +="</form></body></html>";

    iframe_doc.open();
    iframe_doc.write(iframe_html);
    $(iframe_doc).find('form').submit();
}

Verwenden Sie dies wie folgt; -

$('#someid').on('click', function() {
    ajax_download('/download.action', {'para1': 1, 'para2': 2});
});

Die Parameter werden als ordnungsgemäße Post-Parameter gesendet, als ob sie von einer Eingabe stammen, und nicht als json-codierte Zeichenfolge wie im vorherigen Beispiel.

CAVEAT: Seien Sie vorsichtig in Bezug auf die Möglichkeit einer variablen Injektion bei diesen Formen. Es gibt möglicherweise eine sicherere Möglichkeit, diese Variablen zu codieren. Alternativ können Sie auch darüber nachdenken, ihnen zu entkommen.

15
Shayne

Ich sah mich dem gleichen Problem gegenüber und löste es erfolgreich. Mein Anwendungsfall ist dies.

"Stellen Sie JSON-Daten auf dem Server bereit und erhalten Sie eine Excel-Datei. Diese Excel-Datei wird vom Server erstellt und als Antwort an den Client zurückgegeben. Laden Sie diese Antwort als Datei mit einem benutzerdefinierten Namen im Browser herunter"

$("#my-button").on("click", function(){

// Data to post
data = {
    ids: [1, 2, 3, 4, 5]
};

// Use XMLHttpRequest instead of Jquery $ajax
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    var a;
    if (xhttp.readyState === 4 && xhttp.status === 200) {
        // Trick for making downloadable link
        a = document.createElement('a');
        a.href = window.URL.createObjectURL(xhttp.response);
        // Give filename you wish to download
        a.download = "test-file.xls";
        a.style.display = 'none';
        document.body.appendChild(a);
        a.click();
    }
};
// Post data to URL which handles post request
xhttp.open("POST", excelDownloadUrl);
xhttp.setRequestHeader("Content-Type", "application/json");
// You should set responseType as blob for binary responses
xhttp.responseType = 'blob';
xhttp.send(JSON.stringify(data));
});

Das obige Snippet ist nur das Folgende

  • Posten eines Arrays als JSON auf dem Server mithilfe von XMLHttpRequest.
  • Nachdem wir den Inhalt als Blob (binär) abgerufen haben, erstellen wir eine herunterladbare URL und hängen sie an einen unsichtbaren "A" -Link an. Klicken Sie dann darauf. Ich habe hier eine POST Anfrage gestellt. Stattdessen können Sie sich auch für ein einfaches GET entscheiden. Wir können die Datei nicht über Ajax herunterladen, müssen XMLHttpRequest verwenden.

Hier müssen wir einige Dinge auf der Serverseite sorgfältig einstellen. Ich habe einige Header in Python Django HttpResponse gesetzt. Sie müssen sie entsprechend einstellen, wenn Sie andere Programmiersprachen verwenden.

# In python Django code
response = HttpResponse(file_content, content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")

Da ich hier xls (Excel) herunterlade, habe ich contentType auf über eins eingestellt. Sie müssen es entsprechend Ihrem Dateityp einstellen. Mit dieser Technik können Sie alle Arten von Dateien herunterladen.

14
Naren Yellavula

Hier ist, was ich getan habe, reines Javascript und HTML. Habe es nicht getestet, aber das sollte in allen Browsern funktionieren.

Javascript-Funktion

var iframe = document.createElement('iframe');
iframe.id = "IFRAMEID";
iframe.style.display = 'none';
document.body.appendChild(iframe);
iframe.src = 'SERVERURL'+'?' + $.param($scope.filtro);
iframe.addEventListener("load", function () {
     console.log("FILE LOAD DONE.. Download should start now");
});

Verwenden Sie nur Komponenten, die in allen Browsern unterstützt werden, und keine zusätzlichen Bibliotheken.

enter image description hereenter image description here

Hier ist mein serverseitiger Java Spring-Controller-Code.

@RequestMapping(value = "/rootto/my/xlsx", method = RequestMethod.GET)
public void downloadExcelFile(@RequestParam(value = "param1", required = false) String param1,
    HttpServletRequest request, HttpServletResponse response)
            throws ParseException {

    Workbook wb = service.getWorkbook(param1);
    if (wb != null) {
        try {
            String fileName = "myfile_" + sdf.format(new Date());
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + ".xlsx\"");
            wb.write(response.getOutputStream());
            response.getOutputStream().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }
8
manukyanv07
function downloadURI(uri, name) 
{
    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}
4

In Rails mache ich das so:

function download_file(file_id) {
  let url       = '/files/' + file_id + '/download_file';
    $.ajax({
    type: 'GET',
    url: url,
    processData: false,
    success: function (data) {
       window.location = url;
    },
    error: function (xhr) {
     console.log(' Error:  >>>> ' + JSON.stringify(xhr));
    }
   });
 }

Der Trick ist der Teil window.location. Die Methode des Controllers sieht folgendermaßen aus:

# GET /files/{:id}/download_file/
def download_file
    send_file(@file.file,
          :disposition => 'attachment',
          :url_based_filename => false)
end
3
aarkerio

Wenn Sie der obigen Antwort noch einige weitere Dinge hinzufügen, müssen Sie eine Datei herunterladen

Unten ist ein Java Frühlingscode, der das Byte Array generiert

@RequestMapping(value = "/downloadReport", method = { RequestMethod.POST })
    public ResponseEntity<byte[]> downloadReport(
            @RequestBody final SomeObejct obj, HttpServletResponse response) throws Exception {

        OutputStream out = new ByteArrayOutputStream();
        // write something to output stream
        HttpHeaders respHeaders = new HttpHeaders();
        respHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        respHeaders.add("X-File-Name", name);
        ByteArrayOutputStream bos = (ByteArrayOutputStream) out;
        return new ResponseEntity<byte[]>(bos.toByteArray(), respHeaders, HttpStatus.CREATED);
    }

Jetzt können Sie in Javascript-Code mit FileSaver.js eine Datei mit folgendem Code herunterladen

var json=angular.toJson("somejsobject");
var url=apiEndPoint+'some url';
var xhr = new XMLHttpRequest();
//headers('X-File-Name')
xhr.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 201) {
        var res = this.response;
        var fileName=this.getResponseHeader('X-File-Name');
        var data = new Blob([res]);
        saveAs(data, fileName); //this from FileSaver.js
    }
}    
xhr.open('POST', url);
xhr.setRequestHeader('Authorization','Bearer ' + token);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.responseType = 'arraybuffer';
xhr.send(json);

Mit dem obigen Befehl wird die Datei heruntergeladen

3

Ok, hier ist der Arbeitscode, wenn Sie MVC verwenden und Ihre Datei von einem Controller erhalten

nehmen wir an, Sie müssen Ihr Byte-Array deklarieren und füllen. Sie müssen nur die Funktion File (mit System.Web.Mvc) verwenden.

byte[] bytes = .... insert your bytes in the array
return File(bytes, System.Net.Mime.MediaTypeNames.Application.Octet, "nameoffile.exe");

fügen Sie dann im selben Controller diese beiden Funktionen hinzu

protected override void OnResultExecuting(ResultExecutingContext context)
    {
        CheckAndHandleFileResult(context);

        base.OnResultExecuting(context);
    }

    private const string FILE_DOWNLOAD_COOKIE_NAME = "fileDownload";

    /// <summary>
    /// If the current response is a FileResult (an MVC base class for files) then write a
    /// cookie to inform jquery.fileDownload that a successful file download has occured
    /// </summary>
    /// <param name="context"></param>
    private void CheckAndHandleFileResult(ResultExecutingContext context)
    {
        if (context.Result is FileResult)
            //jquery.fileDownload uses this cookie to determine that a file download has completed successfully
            Response.SetCookie(new HttpCookie(FILE_DOWNLOAD_COOKIE_NAME, "true") { Path = "/" });
        else
            //ensure that the cookie is removed in case someone did a file download without using jquery.fileDownload
            if (Request.Cookies[FILE_DOWNLOAD_COOKIE_NAME] != null)
                Response.Cookies[FILE_DOWNLOAD_COOKIE_NAME].Expires = DateTime.Now.AddYears(-1);
    }

und dann können Sie Ihren Controller anrufen, um den "Erfolg" - oder "Fehler" -Rückruf herunterzuladen und zu erhalten

$.fileDownload(mvcUrl('name of the controller'), {
            httpMethod: 'POST',
            successCallback: function (url) {
            //insert success code

            },
            failCallback: function (html, url) {
            //insert fail code
            }
        });
1
Yannick Richard

Ich habe ein Update gefunden, das es Ihnen ermöglicht, einen Javascript-Aufruf zu verwenden, um den Download anzufordern, und dann einen Rückruf zu erhalten, wenn der Download tatsächlich startet, obwohl es kein Ajax verwendet. Ich fand dies hilfreich, wenn der Link ein serverseitiges Skript ausführt, das ein wenig Zeit benötigt, um die Datei zu erstellen, bevor sie gesendet wird. Sie können sie also darauf hinweisen, dass die Datei verarbeitet wird. Wenn die Datei dann endgültig gesendet wird, entfernen Sie diese Verarbeitungsbenachrichtigung. Aus diesem Grund wollte ich zunächst versuchen, die Datei über Ajax zu laden, damit ein Ereignis eintreten kann, wenn die Datei angefordert wird, und ein anderes, wenn der Download tatsächlich beginnt.

die js auf der Titelseite

function expdone()
{
    document.getElementById('exportdiv').style.display='none';
}
function expgo()
{
   document.getElementById('exportdiv').style.display='block';
   document.getElementById('exportif').src='test2.php?arguments=data';
}

der iframe

<div id="exportdiv" style="display:none;">
<img src="loader.gif"><br><h1>Generating Report</h1>
<iframe id="exportif" src="" style="width: 1px;height: 1px; border:0px;"></iframe>
</div>

dann die andere Datei:

<!DOCTYPE html>
<html>
<head>
<script>
function expdone()
{
    window.parent.expdone();
}
</script>
</head>
<body>
<iframe id="exportif" src="<?php echo "http://10.192.37.211/npdtracker/exportthismonth.php?arguments=".$_GET["arguments"]; ?>"></iframe>
<script>document.getElementById('exportif').onload= expdone;</script>
</body></html>

Ich denke, es gibt eine Möglichkeit, get-Daten mit js zu lesen, so dass dann kein PHP benötigt würde. aber ich kenne es nicht von der Hand und der Server, den ich benutze, unterstützt PHP, so dass dies für mich funktioniert. dachte, ich würde es teilen, falls es jemandem hilft.

0
Kit Ramos

Ich hatte lange mit diesem Problem zu kämpfen. Schließlich schlug eine elegante externe Bibliothek vor hier hat mir geholfen.

0

Es ist sicher, dass Sie es nicht über Ajax-Aufruf tun können.

Es gibt jedoch eine Problemumgehung.

Schritte :

Wenn Sie form.submit () zum Herunterladen der Datei verwenden, können Sie Folgendes tun:

  1. Erstellen Sie einen Ajax-Aufruf vom Client zum Server und speichern Sie den Dateistream in der Sitzung.
  2. Wenn "success" vom Server zurückgegeben wird, rufen Sie form.submit () auf, um nur den in der Sitzung gespeicherten Dateistream zu streamen.

Dies ist hilfreich, wenn Sie entscheiden möchten, ob die Datei nach der Erstellung von form.submit () heruntergeladen werden soll oder nicht, z Nach einem Absturz müssen Sie möglicherweise eine benutzerdefinierte Meldung auf der Clientseite anzeigen. In diesem Fall kann diese Implementierung hilfreich sein.

0
Aman Srivastava

Verwenden Sie window.openhttps://developer.mozilla.org/en-US/docs/Web/API/Window/open

Beispielsweise können Sie diese Codezeile in einen Click-Handler einfügen:

window.open('/file.txt', '_blank');

Es öffnet sich eine neue Registerkarte (aufgrund des Fensternamens '_blank') und diese Registerkarte öffnet die URL.

Ihr serverseitiger Code sollte auch ungefähr so ​​aussehen:

res.set('Content-Disposition', 'attachment; filename=file.txt');

Auf diese Weise sollte der Browser den Benutzer auffordern, die Datei auf der Festplatte zu speichern, anstatt sie nur anzuzeigen. Der gerade geöffnete Tab wird automatisch geschlossen.

0
Andrew Koster

es gibt eine andere Lösung, um eine Webseite in Ajax herunterzuladen. Aber ich beziehe mich auf eine Seite, die zuerst verarbeitet und dann heruntergeladen werden muss.

Zuerst müssen Sie die Seitenverarbeitung vom Ergebnis-Download trennen.

1) Beim Ajax-Aufruf werden nur die Seitenberechnungen durchgeführt.

 $ .post ("CalculusPage.php", {calculusFunction: true, ID: 29, data1: "a", data2: "b"}, 
 
 Funktion (data , status) 
 {
 if (status == "success") 
 {
/* 2) In der Antwort wird die Seite heruntergeladen, die die vorherigen Berechnungen verwendet . Dies kann beispielsweise eine Seite sein, die die Ergebnisse einer im Ajax-Aufruf berechneten Tabelle druckt. */
 window.location.href = DownloadPage.php + "? ID =" + 29; 
} 
} 
); 
 
 // Zum Beispiel: in der CalculusPage.php 
 
 If (! Empty ($ _ POST ["calculusFunction"])) 
 {
 $ ID = $ _POST ["ID"]; 
 
 $ Query = "INSERT INTO ExamplePage (data1, data2) VALUES ('". $ _POST ["data1"]. "', '". $ _POST ["data2"]. "') WHERE id =". $ ID; 
 ... 
} 
 
 // Zum Beispiel: in der DownloadPage.php 
 
 $ ID = $ _GET ["ID"]; 
 
 $ Sede = "SELECT * FROM ExamplePage WHERE id =". $ ID; 
 ... 
 
 $ filename = "Export_Data.xls"; 
 header ("Content-Type: application/vnd.ms-Excel"); 
 Header ("Content-Disposition: Inline; Dateiname = $ Dateiname"); 
 
 ... 

Ich hoffe, diese Lösung kann für viele von Nutzen sein, so wie es für mich war.

0
netluke

Wenn Sie den jQuery-Dateidownload verwenden möchten, beachten Sie dies für den IE. Sie müssen die Antwort zurücksetzen, sonst wird sie nicht heruntergeladen

    //The IE will only work if you reset response
    getServletResponse().reset();
    //The jquery.fileDownload needs a cookie be set
    getServletResponse().setHeader("Set-Cookie", "fileDownload=true; path=/");
    //Do the reset of your action create InputStream and return

Ihre Aktion kann ServletResponseAware implementieren, um auf getServletResponse() zuzugreifen.

0
Alireza Fattahi