Mein Ansatz basiert vollständig auf jQuery. Das Problem für mich war, dass es ein POST-HTTP-Aufruf sein muss. Und ich wollte, dass es durch jQuery allein getan werden.
Die Lösung:
$.ajax({
type: "POST",
url: "/some/webpage",
headers: {'X-CSRF-TOKEN': csrfToken},
data: additionalDataToSend,
dataType: "text",
success: function(result) {
let blob = new Blob([result], { type: "application/octetstream" });
let a = document.createElement('a');
a.href = window.URL.createObjectURL(blob);
a.download = "test.xml";;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(a.href);
...
},
error: errorDialog
});
Erläuterung:
Was ich und viele andere tun, ist, einen Link auf der Webseite zu erstellen, der angibt, dass das Ziel heruntergeladen werden soll, und das Ergebnis der http-Anfrage als Ziel anzugeben. Danach füge ich den Link an das Dokument an, als einfach Klicken Sie auf die Verknüpfung und das anschließende Entfernen der Verknüpfung. Sie brauchen keinen iframe mehr.
Der Zauber liegt in den Linien
let blob = new Blob([result], { type: "application/octetstream" });
a.href = window.URL.createObjectURL(blob);
Der interessante Punkt ist, dass diese Lösung nur mit einem " Klecks ". Wie Sie in anderen Antworten sehen können, verwenden einige einfach einen Blob, ohne zu erklären, warum und wie man ihn erstellt. Wie Sie z.B. in der Dokumentation für Mozilla-Entwickler Sie benötigen eine Datei, Medienressource oder einen Blob für die Funktion " createObjectURL() " zu funktionieren. Das Problem ist, dass Ihre http-Antwort möglicherweise keines davon ist. Daher müssen Sie als erstes Ihre Antwort in einen Blob umwandeln. Dies geschieht in der ersten Zeile. Dann können Sie die " createObjectURL " mit Ihrem neu erstellten Blob. Wenn Sie dann auf den Link klicken, öffnet Ihr Browser ein Dialogfeld zum Speichern der Datei und Sie können Ihre Daten speichern. Natürlich ist es möglich, dass Sie keinen festen Dateinamen für Ihre herunterzuladende Datei angeben können. Dann müssen Sie Ihre Antwort komplexer gestalten wie in der Antwort von Lukas.
Und vergessen Sie nicht, den Speicher freizugeben, besonders wenn Sie mit großen Dateien arbeiten. Weitere Beispiele und Informationen finden Sie unter die Details des JS-Blob-Objekts