Download Excel-Datei via AJAX MVC
Habe ich eine große(ish) in form von MVC.
Ich muss in der Lage sein zum generieren einer excel-Datei mit Daten aus einer Teilmenge dieser form.
Das knifflige bit ist, dass dies nicht Auswirkungen auf den rest der form und so wollte ich es via AJAX. Ich habe über kommen ein paar Fragen auf, DAMIT verbunden zu sein scheint, aber ich kann nicht ganz herausfinden, was die Antworten bedeuten.
Dieser scheint dem am nächsten, was ich nach: asp-net-mvc-Download-excel - aber ich bin mir nicht sicher, ich verstehe die Antwort, und es ist ein paar Jahre alt jetzt. Stieß ich auch auf einen anderen Artikel (finde Sie nicht mehr) über die Verwendung von einem iframe zu behandeln, die Datei herunterladen, aber ich bin mir nicht sicher, wie man diese Arbeit mit MVC.
Meine excel-Datei wieder in Ordnung, wenn ich dabei bin, eine vollständige post zurück, aber ich kann nicht erhalten, es funktioniert mit AJAX in mvc.
InformationsquelleAutor Valuk | 2013-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht direkt zurück eine Datei für den download über ein AJAX-Aufruf, so dass ein alternativer Ansatz ist die Verwendung eines AJAX-Aufrufs, um post-Daten zu deinem server. Sie können dann verwenden Sie server-side-code zum erstellen der Excel-Datei (ich würde empfehlen, mit EPPlus oder NPOI für das, auch wenn es so klingt, als wenn Sie an diesem Teil arbeiten).
Meine ursprüngliche Antwort (unten) wurde über 3 Jahre alt, so dass ich dachte, ich würde aktualisieren, wie ich nicht mehr erstellen, Dateien auf dem server beim herunterladen von Dateien via AJAX allerdings habe ich Links die original-Antwort, wie es Ihnen von nutzen sein kann noch, je nach Ihren spezifischen Anforderungen.
Ein häufiges Szenario in meinem MVC-Anwendungen ist die Berichterstattung über eine web-Seite, die einige Benutzer konfigurierten report-Parameter (Datum Reicht, Filter etc.). Wenn der Benutzer angegeben hat, die Parameter, die Sie post an den server, der den Bericht generiert (sagen wir zum Beispiel eine Excel-Datei als output) und habe dann speichern Sie die resultierende Datei als byte-array in die
TempData
Eimer mit einer eindeutigen Referenz. Diese Referenz wird übergeben, wie ein Json-Ergebnis an meine AJAX-Funktion, die anschließend leitet zu einer separaten controller-action zum extrahieren der Daten ausTempData
herunterladen und auf den Endbenutzer-browser.Zu geben, diese genauer, vorausgesetzt, Sie haben eine MVC-Ansicht, die eine form gebunden, um eine Model-Klasse, nennen wir das Modell
ReportVM
.Erste, eine controller-Aktion ist erforderlich, um zu empfangen, werden die gebuchten Modells, ein Beispiel wäre:
Den AJAX-Aufruf, Beiträge mein MVC-form, um die oben genannten controller, und erhält die Antwort sieht wie folgt aus:
Die controller-action zu handhaben, das Download der Datei:
Einer anderen änderung kann leicht angepasst werden, wenn erforderlich ist das bestehen der MIME-Typ der Datei als Dritten parameter so, dass der eine Controller-Aktion könnte richtig servieren eine Vielzahl von Ausgabe-Datei-Formate.
Dies beseitigt die Notwendigkeit für physische Dateien erstellt und auf dem server gespeichert, so dass keine Zimmerreinigung Routinen benötigt und noch einmal dies ist für den Endbenutzer nahtlose.
Hinweis, der Vorteil der Verwendung
TempData
eher alsSession
ist, dass, sobaldTempData
ist, Lesen Sie die Daten gelöscht, so wird es effizienter in Bezug auf die Speichernutzung, wenn Sie eine große Anzahl von Datei-Anfragen. Sehen TempData Best Practice.Können Sie nicht direkt zurück eine Datei für den download über ein AJAX-Aufruf, so dass ein alternativer Ansatz ist die Verwendung eines AJAX-Aufrufs, um post-Daten zu deinem server. Sie können dann verwenden Sie server-side-code zum erstellen der Excel-Datei (ich würde empfehlen, mit EPPlus oder NPOI für das, auch wenn es so klingt, als wenn Sie an diesem Teil arbeiten).
Sobald die Datei erstellt wurde, auf dem server wieder übergeben Sie den Pfad zu der Datei (oder nur Dateinamen) als den return-Wert auf den AJAX-Aufruf und legen Sie dann die JavaScript -
window.location
zu dieser URL, die aufgefordert wird, den browser zum download der Datei.Aus der Endbenutzer-Perspektive, die Datei download-Vorgang ist nahtlos, da Sie nie verlassen die Seite, auf der die Anfrage stammt.
Unten ist ein einfaches erfundenes Beispiel für eine ajax-call um dies zu erreichen:
Einer Probe controller-Methode für die Download-Aktion wäre:
Nicht, dass ich mir bewusst bin - dieser Ansatz, den ich verwendet haben mehrmals erfolgreich. Aus der Sicht eines Benutzers ist es, eine nahtlose, das einzige, was zu achten ist, dass Sie benötigen, Hauswirtschaft routine zum Aufräumen der Dateien, die erstellt werden, als Sie häufen im Laufe der Zeit.
schöne Erklärung, danke.
Erstellen eines Endpunkts '/Download?Datei=...' SCHREIT massiven Sicherheitsrisiko - ich bin kein security-Experte, aber ich würde denken, Sie würde wollen, fügen Sie Benutzerauthentifizierung hinzu, Eingang Hygiene, MVC [ValidateAntiForgeryToken] und noch andere security-best-practices für diese Antwort.
Ich bin immer der Fehler 0x800a03f6 - JavaScript runtime error: Invalid character auf die var response = JSON.parse(data);
InformationsquelleAutor CSL
My 2 cents - Sie brauchen nicht zu speichern, die excel als physische Datei auf dem server statt, speichern Sie es in die (Session -) Cache. Verwenden Sie einen individuell erstellten Namen für Ihr Cache-variable (gespeichert, die excel-Datei) - dies wird die Rückkehr Ihrer (ersten) ajax-call. Auf diese Weise müssen Sie nicht haben, um mit Datei-Zugriff von Problemen, das verwalten (löschen) der Dateien, wenn Sie nicht benötigt wird, etc. und, dass die Datei im Cache, ist schneller, um Sie abzuholen.
OK. Das habe ich getan. Das ist toll. Vielen Dank für Ihren Hinweis! 🙂
Ein Beispiel wäre schön (ich meine, wie um es zu speichern in den cache, nicht die Erzeugung der excel-Datei).
Wie skalierbar ist diese aber? Wenn ein Benutzer das herunterladen von mehreren großen berichten?
Wenn Sie auf der Azure-session funktioniert, BIS Sie das Gerät AUSSCHALTEN ARRAffinity.
InformationsquelleAutor Luchian
Ich war vor kurzem in der Lage, dies zu erreichen in MVC (obwohl es keine Notwendigkeit für die Verwendung von AJAX), ohne eine physikalische Datei und dachte, ich würde teilen mein code:
Super einfache JavaScript-Funktion, die datatables.net klicken Sie auf die Schaltfläche löst diese):
C# - Controller-code:
In der ExportHelper Klasse ich tun, verwenden Sie eine 3rd-party-tool (GemBox.Arbeitsblatt) zu generieren, die Excel-Datei, und es hat eine Save-Stream-option. That being said, es gibt eine Reihe von Möglichkeiten zum erstellen von Excel-Dateien, die leicht sein können geschrieben werden, um ein Speicher-stream.
In IE, Chrome und Firefox, der browser aufgefordert, die Datei zu downloaden und keine eigentliche navigation erfolgt.
InformationsquelleAutor Andy S
Benutzte ich die Lösung gepostet von CSL würde ich aber empfehlen Sie nicht, die Datei speichern, Daten in Session während der gesamten Sitzung. Durch die Verwendung von TempData die Daten der Datei wird automatisch entfernt, wenn der nächste Antrag (das ist die GET-Anforderung für die Datei). Man könnte auch verwalten, entfernen der Datei Daten in der Session in der download-Aktion.
Sitzung könnte verbrauchen viel Speicher - /Platz je nach SessionState-Speicher und wie viele Dateien exportiert werden, die während der Sitzung, und wenn Sie viele Benutzer haben.
Habe ich aktualisiert, die Server-side-code von CSL zu verwenden TempData statt.
InformationsquelleAutor Niclas
Zunächst Erstellen Sie die controller-Aktion, erstellen Sie die Excel-Datei
erstellen Sie dann die Download-Aktion
wenn Sie möchten, um die Datei zu löschen, nachdem Sie heruntergeladen erstellen dieser
und schließlich ajax-Aufruf aus, die Sie MVC Razor-Ansicht
InformationsquelleAutor Elvin Acevedo
Dieser thread hat mir geholfen, meine eigene Lösung, die Teile ich hier. Ich war mit einer GET-ajax-request auf den ersten ohne Probleme, aber es kam zu einem Punkt, wo die Anfrage für die URL-Länge überschritten war, so musste ich mit einer POST -.
Javascript JQuery verwendet Datei-download-plugin und besteht aus 2 nachfolgenden Anrufe. Ein POST (senden params) und man zum abrufen der Datei.
Server-Seite
InformationsquelleAutor Machinegon
CSL ' s Antwort war, umgesetzt in ein Projekt an dem ich arbeite, aber das problem, das ich angefallen wurde die Skalierung auf Azure brach unsere Datei-downloads. Statt dessen war ich in der Lage, dies zu tun mit einem AJAX-Aufruf:
SERVER
CLIENT
(modifizierte version von Handle-Datei-download von ajax post)
InformationsquelleAutor wilsjd
mit ClosedXML.Excel;
Im AJAX-AUFRUF Erfolg Blockieren, success: function (Rdata) { debugger; var bytes = new Uint8Array(Rdata.FileContents); var blob = new Blob([bytes], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.Blatt" }); var link = document.createElement('a'); link.href = " Fenster.URL.createObjectURL blob (); link.download = "myFileName.xlsx"; link.klicken Sie(); },
einige Haben umgesetzt Excel-Datei herunterladen, in dem oben genannten link, es funktioniert nur für die @html.Beginform (), dann nach kleinen änderungen, die code für AJAX-Aufruf Erfolg Blockieren, Bitte Überprüfen Sie es, es funktioniert gut in AJAX-CALL
InformationsquelleAutor G.V.K.RAO
InformationsquelleAutor G.V.K.RAO
Auf " Submit form
InformationsquelleAutor Rajesh Kumar