Aufforderung zum Herunterladen von Dateien mit XMLHttpRequest

9

Ich bin mir bewusst, dass die ajax-Methode von jQuery keine Downloads verarbeiten kann, und ich möchte dafür kein jQuery-Plugin hinzufügen.

Ich möchte wissen, wie man POST-Daten mit XMLHttpRequest sendet, um eine Datei herunterzuladen.

Folgendes habe ich versucht:

%Vor%

Ich arbeite mit Django, und die Datei scheint erfolgreich zum Client zurückzusenden. Auf der Registerkarte "Netzwerk" in Chrome kann ich Kauderwelsch in der Vorschau anzeigen (was ich erwarte). Aber ich möchte eine Zip-Datei zurücksenden, keine Textdarstellung der Zip-Datei. Hier ist das Django-Backend:

%Vor%

Ich habe das jetzt stundenlang gesucht, ohne ein geeignetes Beispiel dafür zu finden, wie man das mit XMLHttpRequests macht. Ich möchte mit einer POST-Aktion kein korrektes HTML-Formular erstellen, da die Formulardaten ziemlich groß sind und dynamisch erstellt werden.

Stimmt etwas mit dem obigen Code nicht? Etwas, das ich vermisse? Ich weiß einfach nicht, wie ich die Daten tatsächlich als Download an den Client senden soll.

    
bozdoz 28.03.2014, 22:12
quelle

2 Antworten

8

Die XHR-Anforderung löst keinen Dateidownload aus. Ich kann keine explizite Anforderung finden, aber W3C doc on XMLHttpRequest beschreibt keine spezielle Reaktion auf content-disposition = Anhang Antworten entweder

Sie können die Datei mit window.open () in einem separaten Tab herunterladen, wenn es sich nicht um eine POST-Anfrage handelt. Hier wurde vorgeschlagen, versteckte Form mit target = _blank

zu verwenden

UPD : Diese Antwort ist seit der Einführung von nicht mehr korrekt Blob API . Bitte beachten Sie Steven's Antwort für Details.

    
Marat 30.03.2014, 00:16
quelle
12

Wenn Sie vor dem Senden der Anforderung die XMLHttpRequest.responseType -Eigenschaft auf 'blob' setzen, wird die zurückgegebene Antwort als Blob dargestellt. Sie können das Blob dann in einer temporären Datei speichern und dorthin navigieren.

%Vor%

Und hier ist eine Beispielimplementierung von saveOrOpenBlob :

%Vor%

Wenn Sie nicht möchten, dass der Browser zu der Datei navigiert, wenn es sich um einen sichtbaren Dateityp handelt, ist die Erstellung einer Methode, die immer direkt in Datei speichert, viel einfacher:

%Vor%     
Steven Doggart 08.06.2017 12:17
quelle