Ich verwende Axios für grundlegende http-Anfragen wie GET und POST und es funktioniert gut. Jetzt muss ich auch Excel-Dateien herunterladen können. Ist das mit Axios möglich? Wenn ja, hat jemand einen Beispielcode? Wenn nicht, was kann ich sonst noch in einer React-Anwendung verwenden, um dasselbe zu tun?
113
Antworten:
Wenn die Antwort mit einer herunterladbaren Datei geliefert wird, sind die Antwort-Header ungefähr so
Sie können eine separate Komponente erstellen, die einen versteckten Iframe enthält.
Jetzt können Sie die URL der herunterladbaren Datei als Requisite an diese Komponente übergeben. Wenn diese Komponente also eine Requisite erhält, wird sie erneut gerendert und die Datei wird heruntergeladen.
Bearbeiten: Sie können auch das Modul js-file-download verwenden . Link zum Github Repo
Hoffe das hilft :)
quelle
responseURL
dies die gewünschte URL.Eine allgemeinere Lösung
Überprüfen Sie die Macken unter https://gist.github.com/javilobo8/097c30a233786be52070986d8cdb1743
Volle Credits an: https://gist.github.com/javilobo8
quelle
responseType: 'blob'
response
nach Abschluss in einer Variablen gespeichert . DanncreateObjectURL
erstellt eine lokale URL auf diese Daten , dass ein <a> navigieren.Herunterladen von Dateien (mit Axios und Sicherheit)
Dies ist sogar noch komplexer, wenn Sie Dateien mit Axios und einigen Sicherheitsmaßnahmen herunterladen möchten. Um zu verhindern, dass andere zu viel Zeit damit verbringen, dies herauszufinden, möchte ich Sie durch diese Sache führen.
Sie müssen 3 Dinge tun:
Diese Schritte sind größtenteils machbar - werden jedoch durch die Beziehung des Browsers zu CORS erheblich erschwert. Ein Schritt auf einmal:
1. Konfigurieren Sie Ihren (HTTP-) Server
Bei Verwendung der Transportsicherheit kann JavaScript, das in einem Browser ausgeführt wird, [beabsichtigt] nur auf 6 der vom HTTP-Server tatsächlich gesendeten HTTP-Header zugreifen. Wenn der Server einen Dateinamen für den Download vorschlagen soll, müssen wir den Browser darüber informieren, dass JavaScript "OK" ist, um Zugriff auf andere Header zu erhalten, in denen der vorgeschlagene Dateiname transportiert wird.
Nehmen wir zur Diskussion an, dass der Server den vorgeschlagenen Dateinamen in einem HTTP-Header namens X-Suggested-Filename übertragen soll . Der HTTP-Server teilt dem Browser mit, dass es in Ordnung ist , diesen empfangenen benutzerdefinierten Header für JavaScript / Axios mit dem folgenden Header verfügbar zu machen:
Die genaue Konfiguration Ihres HTTP-Servers zum Festlegen dieses Headers variiert von Produkt zu Produkt.
2. Implementieren Sie den serverseitigen Dienst
Ihre serverseitige Service-Implementierung muss jetzt zwei Dinge ausführen:
Dies erfolgt je nach gewähltem Technologie-Stack auf unterschiedliche Weise. Ich werde ein Beispiel mit dem JavaEE 7-Standard skizzieren, das einen Excel-Bericht ausgeben soll:
Der Dienst gibt jetzt das Binärdokument aus (in diesem Fall einen Excel-Bericht), legt den richtigen Inhaltstyp fest und sendet außerdem einen benutzerdefinierten HTTP-Header mit dem vorgeschlagenen Dateinamen, der beim Speichern des Dokuments verwendet werden soll.
3. Implementieren Sie einen Axios-Handler für das empfangene Dokument
Hier gibt es einige Fallstricke. Stellen Sie daher sicher, dass alle Details korrekt konfiguriert sind:
Die Axios-Implementierung des Skeletts wäre dann wie folgt:
quelle
content-disposition
anstelle von Header zu verwendenx-suggested-filename
.Axios.post-Lösung mit IE und anderen Browsern
Ich habe hier einige unglaubliche Lösungen gefunden. Probleme mit dem IE-Browser werden jedoch häufig nicht berücksichtigt. Vielleicht spart es jemand anderem etwas Zeit.
Das obige Beispiel gilt für Excel-Dateien, kann jedoch mit geringen Änderungen auf jedes Format angewendet werden.
Und auf dem Server habe ich dies getan, um eine Excel-Datei zu senden.
quelle
quelle
quelle
Es ist sehr einfacher Javascript-Code, um einen Download für den Benutzer auszulösen:
window.open("<insert URL here>")
Sie möchten / brauchen keine Axios für diese Operation. Es sollte Standard sein, den Browser einfach das tun zu lassen.
Hinweis: Wenn Sie eine Autorisierung für den Download benötigen, funktioniert dies möglicherweise nicht. Ich bin mir ziemlich sicher, dass Sie Cookies verwenden können, um eine solche Anfrage zu autorisieren, vorausgesetzt, sie befindet sich in derselben Domain, aber in einem solchen Fall funktioniert dies möglicherweise nicht sofort.
Ob es möglich ist ... nicht mit dem eingebauten Mechanismus zum Herunterladen von Dateien, nein .
quelle
Der Trick besteht darin, ein unsichtbares Ankertag im zu erstellen und eine Reaktion
render()
hinzuzufügen, die esref
ermöglicht, einen Klick auszulösen, sobald wir die Axios-Antwort erhalten haben:Hier ist die Dokumentation: https://reactjs.org/docs/refs-and-the-dom.html . Eine ähnliche Idee finden Sie hier: https://thewebtier.com/snippets/download-files-with-axios/ .
quelle
Für Axios POST - Anforderung sollte die Anfrage so etwas wie diese: Der Schlüssel hier ist , dass die
responseType
undheader
Felder in dem 3. Parameter des Eintrages sein muss. Der 2. Parameter sind die Anwendungsparameter.quelle
Meine Antwort ist ein totaler Hack - ich habe gerade einen Link erstellt, der wie eine Schaltfläche aussieht, und die URL dazu hinzugefügt.
Ich verwende die hervorragenden VueJs, daher die seltsamen Anotationen. Diese Lösung ist jedoch rahmenunabhängig. Die Idee würde für jedes HTML-basierte Design funktionieren.
quelle