Ich möchte eine "Ajax-Download-Anfrage" senden, wenn ich auf eine Schaltfläche klicke. Deshalb habe ich Folgendes versucht:
Javascript:
var xhr = new XMLHttpRequest();
xhr.open("GET", "download.php");
xhr.send();
download.php:
<?
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename= file.txt");
header("Content-Transfer-Encoding: binary");
readfile("file.txt");
?>
funktioniert aber nicht wie erwartet, wie kann ich das machen? Vielen Dank im Voraus
location.href='download.php';
Antworten:
Update 27. April 2015
Das Herunterladen der HTML5-Szene ist das Download-Attribut . Es wird in Firefox und Chrome unterstützt und wird bald in IE11 verfügbar sein. Abhängig von Ihren Anforderungen können Sie es anstelle einer AJAX-Anfrage (oder Verwendung
window.location
) verwenden, solange sich die Datei, die Sie herunterladen möchten, auf demselben Ursprung wie Ihre Site befindet.Sie können die AJAX-Anforderung /
window.location
einen Fallback jederzeit durchführen, indem Sie JavaScript verwenden , um zu testen, ob siedownload
unterstützt wird, und wenn nicht, sie auf Aufruf umzustellenwindow.location
.Ursprüngliche Antwort
Sie können die Download-Eingabeaufforderung nicht durch eine AJAX-Anforderung öffnen, da Sie physisch zu der Datei navigieren müssen, um zum Herunterladen aufzufordern. Stattdessen können Sie eine Erfolgsfunktion verwenden, um zu download.php zu navigieren. Dadurch wird die Download-Eingabeaufforderung geöffnet, die aktuelle Seite wird jedoch nicht geändert.
Obwohl dies die Frage beantwortet, ist es besser,
window.location
die AJAX-Anforderung nur zu verwenden und vollständig zu vermeiden.quelle
Dafür brauchst du eigentlich gar keinen Ajax. Wenn Sie nur "download.php" als href auf der Schaltfläche festlegen oder wenn es sich nicht um einen Link handelt, verwenden Sie:
Der Browser sollte den binären Download erkennen und nicht die eigentliche Seite laden, sondern nur die Datei als Download bereitstellen.
quelle
window.location
ist JavaScript.Damit der Browser eine Datei herunterlädt, müssen Sie die Anfrage folgendermaßen stellen:
quelle
<a>
Tag auch "on the fly" mit JS erstellen , müssen es aber anhängendocument.body
. Sie möchten es sicherlich gleichzeitig verstecken.Browserübergreifende Lösung, getestet auf Chrome, Firefox, Edge, IE11.
Fügen Sie im DOM ein verstecktes Link-Tag hinzu:
Dann:
quelle
Authorization
?window.URL.revokeObjectURL(el.href);
nach dem Hinzufügen vorel.click()
?Es ist möglich. Sie können den Download beispielsweise innerhalb einer Ajax-Funktion starten, unmittelbar nachdem die CSV-Datei erstellt wurde.
Ich habe eine Ajax-Funktion, die eine Datenbank mit Kontakten in eine CSV-Datei exportiert und unmittelbar nach deren Abschluss automatisch den Download der CSV-Datei startet. Nachdem ich den responseText erhalten habe und alles in Ordnung ist, leite ich den Browser folgendermaßen um:
Meine download.php- Datei sieht folgendermaßen aus:
Es erfolgt keinerlei Seitenaktualisierung und die Datei wird automatisch heruntergeladen.
HINWEIS - In folgenden Browsern getestet:
quelle
ich bevorzuge
location.assign(url);
Vollständiges Syntaxbeispiel:
developer.mozilla.org/en-US/docs/Web/API/Location.assign
quelle
Das Dekodieren eines Dateinamens aus dem Header ist etwas komplexer ...
quelle
Diese Lösung unterscheidet sich nicht sehr von den oben genannten, aber für mich funktioniert sie sehr gut und ich denke, sie ist sauber.
Ich empfehle, base64 die Dateiserverseite zu codieren (base64_encode (), wenn Sie PHP verwenden) und die base64-codierten Daten an den Client zu senden
Auf dem Client tun Sie dies:
Dieser Code fügt die codierten Daten in einen Link ein und simuliert einen Klick auf den Link. Anschließend wird er entfernt.
quelle
Ihre Anforderungen werden von abgedeckt.
window.location('download.php');
Ich denke jedoch, dass Sie die herunterzuladende Datei übergeben müssen und nicht immer dieselbe Datei herunterladen müssen. Aus diesem Grund verwenden Sie eine Anfrage. Eine Option besteht darin, eine PHP-Datei zu erstellen, die so einfach wie showfile.php und ist mache eine Anfrage wie
showfile.php
Dabei ist Datei der Dateiname, der in der Anforderung über Get oder Post übergeben wird, und fängt dann die Antwort in einer Funktion einfach ab
quelle
Es gibt eine andere Lösung zum Herunterladen einer Webseite in Ajax. Ich beziehe mich jedoch auf eine Seite, die zuerst verarbeitet und dann heruntergeladen werden muss.
Zuerst müssen Sie die Seitenverarbeitung vom Ergebnisdownload trennen.
1) Im Ajax-Aufruf werden nur die Seitenberechnungen durchgeführt.
Ich hoffe, diese Lösung kann für viele nützlich sein, so wie es für mich war.
quelle
Für diejenigen, die einen moderneren Ansatz suchen, können Sie die verwenden
fetch API
. Das folgende Beispiel zeigt, wie Sie eine Tabellenkalkulationsdatei herunterladen. Mit dem folgenden Code ist dies problemlos möglich.Ich glaube, dieser Ansatz ist viel einfacher zu verstehen als andere
XMLHttpRequest
Lösungen. Außerdem hat es eine ähnliche Syntax wie derjQuery
Ansatz, ohne dass zusätzliche Bibliotheken hinzugefügt werden müssen.Natürlich würde ich empfehlen, zu überprüfen, in welchem Browser Sie entwickeln, da dieser neue Ansatz im IE nicht funktioniert. Die vollständige Browserkompatibilitätsliste finden Sie unter folgendem Link .
Wichtig : In diesem Beispiel sende ich eine JSON-Anfrage an einen Server, der die angegebenen Daten abhört
url
. Diesurl
muss festgelegt werden. In meinem Beispiel gehe ich davon aus, dass Sie diesen Teil kennen. Berücksichtigen Sie auch die Header, die für Ihre Anfrage erforderlich sind. Da ich einen JSON sende, muss ich denContent-Type
Header hinzufügen und auf setzenapplication/json; charset=utf-8
, um dem Server den Typ der Anforderung mitzuteilen, die er erhalten wird.quelle
Die @ Joao Marcos-Lösung funktioniert für mich, aber ich musste den Code ändern, damit er im IE funktioniert. Unten sehen Sie, wie der Code aussieht
quelle