Excel-Datei (.xlsx) aus der server-Antwort in ajax
Ich habe ein problem mit dem Ausstieg excel-Datei und das öffnen des download-Fensters im browser nach dem aufstehen eine Antwort (Erfolg ajax-Methode) mit dieser Datei. Ich habe entsprechende Content-Type and Content-Disposition headers
, versuchte ich mit Blob in js und ich konnte nicht das erreichen, was ich will - einfach die Datei herunterladen.
Ich vollbrachte einige Versionen meiner ajax, einer von Ihnen ist unten. Ich entwickelte ajax, kehrt excel-Datei, die konnte ich nicht richtig öffnen, weil es beschädigt ist (trotz .xlsx-Erweiterung).
Vielleicht ist das problem mit ungeeigneten Datentyp verwendet, die in einem Blob-Konstruktor?
Ich habe versucht, mit "xhr.Antwort" anstelle von "Daten" aus Erfolg, Methode, Argumente, aber es funktioniert nicht zu. Ich überprüfte Antwort-Headern in den Developer Tools in Chrome und Sie sind richtig eingestellt.
Das wichtigste - alle excel-Arbeitsmappen erstellt, die auf der server-Seite ist korrekt, denn es funktionierte in der vorherigen version, wenn Daten gesendet wurde, in der URL, nicht in ajax post.
Controller-Methode in der Java - /Spring-server-Seite unter:
response.reset();
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition","attachment;filename=\"" + className + " " + title + ".xlsx\"");
try (ServletOutputStream output = response.getOutputStream()){
workbook.write(output);
output.flush();
} catch (Exception e) {
throw new RuntimeException(e);
}
Meine Ajax-Datei downloaden und öffnen des download-Fensters:
$.ajax({
url: myUrl,
type: 'POST',
data: myData,
success: function(data, status, xhr) {
var contentType = 'application/vnd.ms-excel';
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, '');
}
console.log("FILENAME: " + filename);
try {
var blob = new Blob([data], { type: contentType });
var downloadUrl = URL.createObjectURL(blob);
var a = document.createElement("a");
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
} catch (exc) {
console.log("Save Blob method failed with the following exception.");
console.log(exc);
}
InformationsquelleAutor KamilosD | 2017-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie JQuery habe ein problem mit den Umgang mit den binären Daten aus der Antwort. Ich benutzt einfach XMLHttpRequest und ich füge alle Daten an die URL.
fileName
auf der Linie 16 wurde nicht definiert. Wo definierst du das?Es ist eingerichtet vor. Aber in diesem Fall ist es egal, weil es sein könnte so etwas wie "My_File.xlsx"
ich bin in der Lage, die Datei zu downloaden aber wenn ich es öffne heißt es "Sorry,wir konnten nicht finden C:\mypath[object object],[object object],....[Objekt Ob.xls. Ist es möglich, Sie wurde verschoben, umbenannt oder gelöscht?" Auch gibt es trotzdem ändern Sie den Namen der Datei beim download?
InformationsquelleAutor KamilosD
Waren wir absolut das gleiche Problem vor kurzem. Für uns begann es zu arbeiten, wenn wir hinzufügen
responseType: 'arraybuffer'
zu denajax
Parameter. Und es ist besser zu Verwendung libhttps://github.com/eligrey/FileSaver.js/
anstelle der manuellen Klick auf den link, da dieses tool widerruft Speicher.responseType: 'arraybuffer'
aber es ist fehlgeschlagen, weil der unangemessen responseType das wartext
wahrscheinlich. Aber ich dieses problem gelöst, direkt mit dem erstellen des XMLHttpRequest. Funktionierenden code in den Kommentar unten.InformationsquelleAutor Aleksandra Vetrova